比赛 20150422 评测结果 AWWWWWWWWW
题目名称 马拉松 最终得分 10
用户昵称 KZNS 运行时间 2.159 s
代码语言 C++ 内存使用 7.18 MiB
提交时间 2015-04-22 11:50:30
显示代码纯文本
#include<fstream>
using namespace std;
ifstream fi("marathona.in");
ofstream fo("marathona.out");
int abs(int a){
	if(a<0)
		return -a;
	return a;
}

class pt{//point
public:
	int x,y;
	void get(){
		fi>>x>>y;
	}
}pu,point[100010];
int far(pt a,pt b){
	return abs(a.x-b.x)+abs(a.y-b.y);
}

class tree{
public:
	int l,r,lc,rc,sm,mn,lf,rf;
	void clean(){
		l=r=lc=rc=sm=mn=lf=rf=0;
	}
}tr[200010],treenew;

tree operator+(tree a,tree b){
	tree u;
	u.l=a.l;
	u.r=b.r;
	u.lc=u.rc=0;
	u.sm=a.sm+b.sm;
	u.lf=a.lf;
	u.rf=b.rf;
	u.mn=min(min(a.mn+b.sm,a.sm+b.mn),a.sm+b.sm-a.rf-b.lf+far(point[a.r-1],point[b.l+1]));
	return u;
}
int toto=1;
void mt(int l,int r){//make tree
	if(l+1==r){
		tree u;
		u.l=l;
		u.r=r;
		u.lc=u.rc=0;
		u.sm=u.mn=u.lf=u.rf=far(point[l],point[r]);
		tr[toto]=u;
		toto++;
		return;
	}
	int md=(l+r)/2,uing=toto,lc,rc;
	tree u;
	toto++;
	lc=toto;
	mt(l,md);
	rc=toto;
	mt(md,r);
	u=tr[lc]+tr[rc];
	u.lc=lc;
	u.rc=rc;
	tr[uing]=u;
}
tree find(int root,int l,int r){
	if(l<=tr[root].l&&tr[root].r<=r)
		return tr[root];
	tree u;
	u.clean();
	if(l<tr[tr[root].lc].r)
		u=find(tr[root].lc,l,r);
	if(tr[tr[root].rc].l<r)
		if(!u.r)
			u=find(tr[root].rc,l,r);
		else
			u=u+find(tr[root].rc,l,r);
	return u;
}
void change(int root,int t){
	if(tr[root].l==t||tr[root].r==t){
		tr[root].sm=tr[root].mn=tr[root].lf=tr[root].rf=far(point[tr[root].l],point[tr[root].r]);
		return;
	}
	if(t<=tr[tr[root].lc].r)
		change(tr[root].lc,t);
	if(tr[tr[root].rc].l<=t)
		change(tr[root].rc,t);
	int lc=tr[root].lc,rc=tr[root].rc;
	tr[root]=tr[lc]+tr[rc];
	tr[root].lc=lc;
	tr[root].rc=rc;
}
int main(){
	int n,q;
	fi>>n>>q;
	for(int i=1;i<=n;i++)
		point[i].get();
	mt(1,n);
	int a,b;
	char c;
	for(int i=0;i<q;i++){
		fi>>c;
		if(c=='Q'){
			fi>>a>>b;
			tree u=find(1,a,b);
			fo<<u.mn<<endl;
		}
		else{
			fi>>a;
			point[a].get();
			change(1,a);
		}
	}
	return 0;
}