比赛 20150422 评测结果 AAAAAAAAAA
题目名称 马拉松 最终得分 100
用户昵称 ztx 运行时间 1.026 s
代码语言 C++ 内存使用 4.87 MiB
提交时间 2015-04-22 10:41:30
显示代码纯文本
/****************************************\
* Author : ztx
* Title  : [cogs] 1946 马拉松
* ALG    : 线段树
* CMT    : 维护两个线段树即可 
* Time   :
\****************************************/

#include <cstdio>
#define Rep(i,l,r) for(i=(l);i<=(r);i++)
#define rep(i,l,r) for(i=(l);i< (r);i++)
#define Rev(i,r,l) for(i=(r);i>=(l);i--)
#define rev(i,r,l) for(i=(r);i> (l);i--)
typedef long long ll ;
int CH , NEG ;
template <typename TP>inline void read(TP& ret) {
    ret = NEG = 0 ; while (CH=getchar() , CH<'!') ;
    if (CH == '-') NEG = true , CH = getchar() ;
    while (ret = ret*10+CH-'0' , CH=getchar() , CH>'!') ;
    if (NEG) ret = -ret ;
}
template <typename TP>inline void readc(TP& ret) {
	while (ret=getchar() , ret<'!') ;
	while (CH=getchar() , CH>'!') ;
}
template <typename TP>inline void reads(TP *ret) {
	ret[0]=0;while (CH=getchar() , CH<'!') ;
	while (ret[++ret[0]]=CH,CH=getchar(),CH>'!') ;
}

#define  maxn  100010LL
#define  maxt  500000LL
#define  infi  0x3f3f3f3fLL

#define  M  (L+R>>1)
#define  l(o) (o<<1)
#define  r(o) (o<<1|1)
#define  left  l(o),L,M
#define  right r(o),M+1,R
#define  max(x,y) ((x)>(y)?(x):(y))

int n ;
int x[maxn] = {0} , y[maxn] = {0} ;
inline int ABS(int x) { return x < 0 ? -x : x ; }
inline int Dist(int i,int j) { return ABS(x[i]-x[j])+ABS(y[i]-y[j]) ; }

int tott = 0 , sumv[maxt] , maxv[maxt] ;

/* 保证其存在两个儿子 */
inline void update1(int o) {
	sumv[o] = sumv[l(o)]+sumv[r(o)] ;
}
inline void update2(int o) {
	maxv[o] = max(maxv[l(o)],maxv[r(o)]) ;
}
inline void Build(int o,int L,int R) {
	if (L == R) { sumv[o] = Dist(L,L-1) ; maxv[o] = Dist(L-1,L)+Dist(L,L+1)-Dist(L-1,L+1) ; return ; }
	Build(left) , Build(right) ; update1(o) , update2(o) ;
}
int qp ;
inline void Change1(int o,int L,int R) {
	if (L == R) { sumv[o] = Dist(L,L-1) ; return ; }
	if (qp > M) Change1(right) ; else Change1(left) ;
	update1(o) ;
}
inline void Change2(int o,int L,int R) {
	if (L == R) { maxv[o] = Dist(L-1,L)+Dist(L,L+1)-Dist(L-1,L+1) ; return ; }
	if (qp > M) Change2(right) ; else Change2(left) ;
	update2(o) ;
}
int ql,qr,ans_s,ans_m ;
inline void Query1(int o,int L,int R) {
	if (ql<=L && R<=qr) { ans_s += sumv[o] ; return ; }
	if (ql <= M) Query1(left) ;
	if (qr >  M) Query1(right) ;
}
inline void Query2(int o,int L,int R) {
	if (ql<=L && R<=qr) { ans_m = max(ans_m,maxv[o]) ; return ; }
	if (ql <= M) Query2(left) ;
	if (qr >  M) Query2(right) ;
}

int main() {
int Q , i , cmd , u , v ;
	#define READ
	#ifdef  READ
		freopen("marathona.in" ,"r",stdin ) ;
		freopen("marathona.out","w",stdout) ;
	#endif
	read(n) , read(Q) ;
	x[0] = 0 , y[0] = 0 ;
	Rep (i,1,n)
		read(x[i]) , read(y[i]) ;
	Build(1,1,n) ;
	while (Q --> 0) {
		readc(cmd) ;
		if (cmd == 'Q') {
			read(u) , read(v) ;
			if (u == v) { puts("0") ; continue ; }
			if (u > v) u^=v,v^=u,u^=v ;
			ans_s = 0 , ans_m = -infi , ql = u+1 , qr = v ;
			Query1(1,1,n) ;
			qr -- ; if (ql<=qr) Query2(1,1,n) ;
			if (ans_m > 0) ans_s -= ans_m ;
			printf("%d\n", ans_s) ;
		}
		if (cmd == 'U') {
			read(u) , read(x[u]) , read(y[u]) ;
			qp = u , Change1(1,1,n) ;
			if (u < n) qp = u+1 , Change1(1,1,n) ;
			qp = u-1 ; if (qp>1 && qp<n) Change2(1,1,n) ;
			qp = u   ; if (qp>1 && qp<n) Change2(1,1,n) ;
			qp = u+1 ; if (qp>1 && qp<n) Change2(1,1,n) ;
		}
	}
	#ifdef  READ
		fclose(stdin) ; fclose(stdout) ;
	#else
		getchar() ; getchar() ;
	#endif
	return 0 ;
}