比赛 |
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 ;
}