比赛 |
20150422 |
评测结果 |
AAAEEEEEEE |
题目名称 |
马拉松 |
最终得分 |
30 |
用户昵称 |
ggwdwsbs |
运行时间 |
0.679 s |
代码语言 |
C++ |
内存使用 |
1.01 MiB |
提交时间 |
2015-04-22 11:49:05 |
显示代码纯文本
#include<stdio.h>
#include<cstring>
const int maxn=10001;
struct tree
{
int left,right;
long long sum;
}a[maxn*4];
int b[maxn];
int build(int k,int l,int r)
{
a[k].left=l;
a[k].right=r;
if(l==r) a[k].sum=b[l];
else
{
build(2*k,l,(l+r)/2);
build(2*k+1,(l+r)/2+1,r);
a[k].sum=a[2*k].sum+a[2*k+1].sum;
}
}
int insert(int k,int x,int num)
{
if(a[k].left==a[k].right)
{
a[k].sum=num;
}
else
{
if(x<=(a[k].left+a[k].right)/2) insert(2*k,x,num);
if(x>(a[k].left+a[k].right)/2) insert(2*k+1,x,num);
a[k].sum=a[2*k].sum+a[2*k+1].sum;
}
}
long long query(int k,int l,int r)
{
if(l>a[k].right||r<a[k].left) return 0;
if(l<=a[k].left&&a[k].right<=r) return a[k].sum;
else return query(2*k,l,r)+query(2*k+1,l,r);
}
int x[maxn];
int y[maxn];
int n,q,l,r,x1,y1,j;
char c;
int abs(int x)
{
if(x>0) return x;
else return -x;
}
int dis(int i,int j)
{
return abs(x[i]-x[j]) + abs(y[i]-y[j]);
}
int main()
{
freopen("marathona.in","r",stdin);
freopen("marathona.out","w",stdout);
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x[i],&y[i]);
b[i]=dis(i,i-1);
}
b[1]=0;
build(1,1,n);
for(int i=1;i<=q;i++)
{
c=getchar();
while(c!='Q'&&c!='U')
c=getchar();
if(c=='Q')
{
scanf("%d%d",&l,&r);
long long ans=query(1,l+1,r);
long long ret=2147483600;
for(int j=l+1;j<=r-1;j++)
if(ret>ans-b[j]-b[j+1]+dis(j-1,j+1))
{
ret=ans-b[j]-b[j+1]+dis(j-1,j+1);
}
printf("%lld\n",ret);
}
if(c=='U')
{
scanf("%d%d%d",&j,&x1,&y1);
x[j]=x1;
y[j]=y1;
b[j]=dis(j,j-1);
b[j+1]=dis(j+1,j);
insert(1,j,b[j]);
insert(1,j+1,b[j+1]);
}
}
}