比赛 20150422 评测结果 AAAAAAAAAA
题目名称 马拉松 最终得分 100
用户昵称 new ioer 运行时间 0.586 s
代码语言 C++ 内存使用 8.11 MiB
提交时间 2015-04-22 10:23:26
显示代码纯文本
#include<stdio.h>
char ch[5000000],*ptr=ch;
int getint(){
	static int gg,ret;gg=0;
	while(*ptr<40) ptr++;
	if(*ptr==45) gg=1,ret=0;
	else ret=*ptr-48;ptr++;
	while(*ptr>47) ret=ret*10+*ptr++-48;
	if(gg) return -ret;return ret;
}
int Abs(int x,int y){
	if(x>y) return x-y;
	return y-x;
}
int M,n,m,i,x[100001],y[100001],t1[300000],t2[300000];
int dis(int a,int b){
	return Abs(x[a],x[b])+Abs(y[a],y[b]);
}
int max(int a,int b){
	if(a>b) return a;
	return b;
}
int sum(int s,int t){
	int res=0;
	for(s+=M-1,t+=M+1;s^t^1;s>>=1,t>>=1){
		if(~s&1) res+=t2[s^1];
		if( t&1) res+=t2[t^1];
	}
	return res;
}
int sax(int s,int t){
	if(s>t) return 0;
	int res=-30000;
	for(s+=M-1,t+=M+1;s^t^1;s>>=1,t>>=1){
		if(~s&1) res=max(res,t1[s^1]);
		if( t&1) res=max(res,t1[t^1]);
	}
	return res;
}
void change(int o,int a,int b){
	x[o]=a,y[o]=b;
	t2[o+M-1]=dis(o-1,o),t2[o+M]=dis(o,o+1);
	for(i=(o+M-1)>>1;i;i>>=1) t2[i]=t2[i<<1]+t2[i<<1|1];
	t1[o+M]=t2[o+M-1]+t2[o+M]-dis(o-1,o+1);
	for(i=(o+M)>>1;i;i>>=1) t1[i]=max(t1[i<<1],t1[i<<1|1]),t2[i]=t2[i<<1]+t2[i<<1|1];
	if(o>2){
		t1[o+M-1]=t2[o+M-2]+t2[o+M-1]-dis(o-2,o);
		for(i=(o+M-1)>>1;i;i>>=1) t1[i]=max(t1[i<<1],t1[i<<1|1]);
	}
	if(o<n-1){
		t1[o+M+1]=t2[o+M]+t2[o+M+1]-dis(o,o+2);
		for(i=(o+M+1)>>1;i;i>>=1) t1[i]=max(t1[i<<1],t1[i<<1|1]);
	}
}
int main(){
	freopen("marathona.in","r",stdin);
	freopen("marathona.out","w",stdout);
	fread(ch,1,5000000,stdin);
	int a,b,c;
	n=getint(),m=getint();
	for(i=1;i<=n;i++)
		x[i]=getint(),y[i]=getint();
	for(M=1;M<n+2;M<<=1);
	t2[M+1]=dis(1,2);
	for(i=2;i<n;i++)
		t2[i+M]=dis(i,i+1),t1[i+M]=t2[i+M-1]+t2[i+M]-dis(i-1,i+1);
	for(i=M-1;i;i--)
		t1[i]=max(t1[i<<1],t1[i<<1|1]),t2[i]=t2[i<<1]+t2[i<<1|1];
	while(m--){
		while(*ptr<60) ptr++;
		if(*ptr=='Q') ptr++,a=getint(),b=getint(),printf("%d\n",sum(a,b-1)-sax(a+1,b-1));
		else ptr++,a=getint(),b=getint(),c=getint(),change(a,b,c);
	}
	return 0;
}