比赛 20150422 评测结果 AAAAAAAAAA
题目名称 马拉松 最终得分 100
用户昵称 天一阁 运行时间 1.440 s
代码语言 C++ 内存使用 7.15 MiB
提交时间 2015-04-22 09:54:04
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <bitset>
#include <algorithm>
#include <queue>
#include <stack>
#include <cmath>

using namespace std;

#ifdef WIN32
	#define IMT "%I64d"
#else
	#define IMT "%lld"
#endif

#define l(x) ch[x][0]
#define r(x) ch[x][1]
#define out(x) cout<<#x<<" = "<<x<<endl;
#define PB(x) push_back(x)
#define MP(x) make_pair(x)
#define LL long long
#define LD double

template<class T> inline char qread(T &x){
	static char ch;
	int k=1;
	while(!isdigit(ch=getchar())) if(ch=='-') k=-1;
	x=ch-'0';
	while(isdigit(ch=getchar()))
		x=(x<<1)+(x<<3)+ch-'0';
	x*=k;
	return ch;
}

void file(){
	 freopen("marathona.in","r",stdin);
	 freopen("marathona.out","w",stdout);
}

/*cpp*/

#define N 100010

struct node{
	int x,y;
	void scan(){
		scanf("%d%d",&x,&y);
	}
}p[N];

int sumv[N<<3],maxv[N<<3],n,m;

int Abs(int x){
	if(x<0) return -x;
	return x;
}

int dist(node a,node b){
	return Abs(a.x-b.x)+Abs(a.y-b.y);
}

void addinm(int o,int l,int r,int qx,int qv){
	if(l==r){
		maxv[o]=qv;
		return;
	}
	int mid=(l+r)>>1;
	if(qx<=mid) addinm(2*o,l,mid,qx,qv);
	else addinm(2*o+1,mid+1,r,qx,qv);
	maxv[o]=max(maxv[2*o],maxv[2*o+1]);
}

void addins(int o,int l,int r,int qx,int qv){
	if(l==r){
		sumv[o]=qv;
		return;
	}
	int mid=(l+r)>>1;
	if(qx<=mid) addins(2*o,l,mid,qx,qv);
	else addins(2*o+1,mid+1,r,qx,qv);
	sumv[o]=sumv[2*o]+sumv[2*o+1];
}

int askm(int o,int l,int r,int ql,int qr){
	if(ql<=l&&r<=qr) return maxv[o];
	int mid=(l+r)>>1,ans=0;
	if(ql<=mid) ans=max(ans,askm(2*o,l,mid,ql,qr));
	if(mid<qr) ans=max(ans,askm(2*o+1,mid+1,r,ql,qr));
	return ans;
}

int asks(int o,int l,int r,int ql,int qr){
	if(ql<=l&&r<=qr) return sumv[o];
	int mid=(l+r)>>1,ans=0;
	if(ql<=mid) ans+=asks(2*o,l,mid,ql,qr);
	if(mid<qr) ans+=asks(2*o+1,mid+1,r,ql,qr);
	return ans;
}

int ask(int l,int r){
	if(l>r) swap(l,r);
	if(l==r) return 0;
	if(r-l==1) return asks(1,1,n,l,r-1);
	int S=asks(1,1,n,l,r-1),M=askm(1,1,n,l+1,r-1);
	return S-M;
}

int a[N],b[N];

void buildm(int o,int l,int r){
	if(l==r){
		maxv[o]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	buildm(2*o,l,mid); buildm(2*o+1,mid+1,r);
	maxv[o]=max(maxv[2*o],maxv[2*o+1]);
}

void builds(int o,int l,int r){
	if(l==r){
		sumv[o]=b[l];
		return;
	}
	int mid=(l+r)>>1;
	builds(2*o,l,mid); builds(2*o+1,mid+1,r);
	sumv[o]=sumv[2*o]+sumv[2*o+1];
}

void updates(int i){
	if(i>=n||i<=0) return;
	b[i]=dist(p[i],p[i+1]);
	addins(1,1,n,i,b[i]);
}

void updatem(int i){
	if(i<=1||i>=n) return;
    a[i]=dist(p[i-1],p[i])+dist(p[i],p[i+1])-dist(p[i-1],p[i+1]);
    addinm(1,1,n,i,a[i]);
}

int main(){
	file();
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) p[i].scan();
	for(int i=1;i<=n;i++){
		if(i>1&&i<n)  a[i]=dist(p[i-1],p[i])+dist(p[i],p[i+1])-dist(p[i-1],p[i+1]);
		if(i<n) b[i]=dist(p[i],p[i+1]);
	}
	buildm(1,1,n);
	builds(1,1,n);
	char cmd;
	for(int i=1;i<=m;i++){
		int l,r;
		while(!isalpha(cmd=getchar()));
		if(cmd=='Q'){
			qread(l); qread(r);
			printf("%d\n",ask(l,r));
		}
		else{
			qread(l);
			p[l].scan();
			updates(l); updates(l-1);
			updatem(l); updatem(l+1); updatem(l-1);
		}
	}
    fclose(stdin);
    fclose(stdout);
    return 0;
}