比赛 |
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;
}