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