记录编号 159629 评测结果 AAAAAAAAAA
题目名称 马拉松 最终得分 100
用户昵称 GravatarChenyao2333 是否通过 通过
代码语言 C++ 运行时间 1.345 s
提交时间 2015-04-22 12:09:26 内存使用 8.78 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
using namespace std;
const int L_N=1e5+10;
const int INF=1e9+10;
struct TreeArr{
	int a[L_N];
	int lowbit(int i){ return i&-i; }
	void add(int p,int val){
		for(;p<L_N;p+=lowbit(p)){
			a[p]+=val;
		}
	}
	int query(int p){
		int ret=0;
		for(;p;p-=lowbit(p)){
			ret+=a[p];
		}
		return ret;
	}
	int query(int l,int r){
		return query(r)-query(l-1);
	}
}ta;

int N,M,X[L_N],Y[L_N];
int pro[L_N];

int calc_len(int i,int j){
	return abs(X[i]-X[j])+abs(Y[i]-Y[j]);
}
int calc_profit(int i){
	if(i==1 || i==N) return 0;
	return max(calc_len(i-1,i) + calc_len(i,i+1) - calc_len(i-1,i+1),0);
}

struct node{
	int ls,rs,l,r;
	int val,mx;
}t[L_N*4];
int node_cnt;
void push_up(int x){
	t[x].mx=t[x].val;
	if(t[x].ls) t[x].mx=max(t[x].mx,t[t[x].ls].mx);
	if(t[x].rs) t[x].mx=max(t[x].mx,t[t[x].rs].mx);
}
void build(int x,int l,int r){
	t[x].l=l, t[x].r=r;
	if(l==r){
		t[x].val=pro[l];
		push_up(x);
		return ;
	}
	int mid=(l+r)/2;
	t[x].ls=++node_cnt, t[x].rs=++node_cnt;
	build(t[x].ls,l,mid);
	build(t[x].rs,mid+1,r);
	push_up(x);
}
void change(int x,int p,int val){
	if(t[x].l==t[x].r){
		t[x].val=val;
		push_up(x);
		return;
	}
	int mid=(t[x].l+t[x].r)/2;
	if(p<=mid) change(t[x].ls,p,val);
	else change(t[x].rs,p,val);
	push_up(x);
}
int query(int x,int l,int r){
	if(l<=t[x].l && t[x].r<=r){
		return t[x].mx;
	}
	int ret=0,mid=(t[x].l+t[x].r)/2;
	if(l<=mid) ret=max(ret,query(t[x].ls,l,r));
	if(r>=mid+1) ret=max(ret,query(t[x].rs,l,r));
	return ret;
}



int main(){
	freopen("marathona.in","r",stdin);
	freopen("marathona.out","w",stdout);
	scanf("%d %d",&N,&M);
	for(int i=1;i<=N;i++){
		scanf("%d %d",X+i,Y+i);
	}
	for(int i=2;i<N;i++){
		pro[i]=calc_profit(i);
	}
	for(int i=1;i<N;i++){
		ta.add(i,calc_len(i,i+1));
	}
	build(++node_cnt,1,N);
	
	for(int i=1;i<=M;i++){
		char op[2]; scanf("%s",op);
		if(op[0]=='Q'){
			int l,r; scanf("%d %d",&l,&r);
			int ans=ta.query(l,r-1);
			if(l+1<=r-1) ans-=query(1,l+1,r-1);
			printf("%d\n",ans);
		}else{
			int id,x,y; scanf("%d %d %d",&id,&x,&y);
			int l1=calc_len(id-1,id), l2=calc_len(id,id+1);
			X[id]=x, Y[id]=y;
			if(id>1) ta.add(id-1,calc_len(id-1,id)-l1);
			if(id<N) ta.add(id,calc_len(id,id+1)-l2);
			
			change(1,id,calc_profit(id));
			if(id>1) change(1,id-1,calc_profit(id-1));
			if(id<N) change(1,id+1,calc_profit(id+1));
		}
	}
	
	return 0;
}