记录编号 159731 评测结果 AAAAAAAAAA
题目名称 马拉松 最终得分 100
用户昵称 Gravatarggwdwsbs 是否通过 通过
代码语言 C++ 运行时间 1.327 s
提交时间 2015-04-22 15:24:16 内存使用 72.77 MiB
显示代码纯文本
#include<stdio.h>
#include<cstring>
const int maxn=1000010;
const int INF=2147483600;
struct tree
{
	int left,right,sum,max;
}a[maxn*4];
int b[maxn];
int ret;
int max(int x,int y)
{
	if(x>y) return x;
	else return y;
}
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 build(int k,int l,int r)
{
	a[k].left=l;
	a[k].right=r;
	if(l==r)
	{
		a[k].sum=b[l];
		if(l>1&&l<n) a[k].max=b[l]+b[l+1]-dis(l-1,l+1);
		else a[k].max=-INF;
	} 
	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;
		a[k].max=max(a[2*k].max,a[2*k+1].max);
	}
}
int change_sum(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) change_sum(2*k,x,num);
		if(x>(a[k].left+a[k].right)/2) change_sum(2*k+1,x,num);
		a[k].sum=a[2*k].sum+a[2*k+1].sum;
	}	
}
int change_max(int k,int x,int num)
{
	if(a[k].left==a[k].right) a[k].max=num;
	else
	{
		if(x<=(a[k].left+a[k].right)/2) change_max(2*k,x,num);
		if(x>(a[k].left+a[k].right)/2) change_max(2*k+1,x,num);
		a[k].max=max(a[2*k].max,a[2*k+1].max);
	}	
}
int 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)
	{
		ret=max(ret,a[k].max);
		return a[k].sum;
	} 
	else return query(2*k,l,r)+query(2*k+1,l,r);
}
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);
			int ans=query(1,l+1,r);
			ret=-INF;
			query(1,l+1,r-1);
			ans-=ret;
			printf("%d\n",ans); 
		}
		if(c=='U')
		{
			scanf("%d%d%d",&j,&x1,&y1);
			x[j]=x1;
			y[j]=y1;
			if(j!=1) b[j]=dis(j-1,j);
			if(j+1<=n) 
			{
				b[j+1]=dis(j+1,j);
				change_sum(1,j+1,b[j+1]);
			}
			change_sum(1,j,b[j]);
			if(j+1<=n&&j-1>=1) change_max(1,j,b[j]+b[j+1]-dis(j-1,j+1));
			if(j+2<=n) change_max(1,j+1,b[j+1]+b[j+2]-dis(j,j+2));
			if(j-2>=1) change_max(1,j-1,b[j-1]+b[j]-dis(j-2,j));
		}
	}
}