Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<stdio.h>
- #include<algorithm>
- #include<set>
- #include<map>
- #include<queue>
- #include<stack>
- #include<deque>
- #include<vector>
- #include<string>
- #include<math.h>
- using namespace std;
- #define INF 1000000001
- #define lint long long
- #define pb push_back
- #define mp make_pair
- #define MOD 1000000007
- int kabs(int a)
- {
- if(a<0)return -a;
- return a;
- }
- int t[270005],ts[270005];
- void updatem(int v,int val)
- {
- t[v]=val;
- v/=2;
- while(v)
- {
- t[v]=t[2*v];
- if(t[2*v+1]>t[v])
- t[v]=t[2*v+1];
- v/=2;
- }
- }
- void update(int v,int val)
- {
- ts[v]=val;
- v/=2;
- while(v)
- {
- ts[v]=ts[2*v]+ts[2*v+1];
- v/=2;
- }
- }
- int getm(int v,int l,int r,int li,int ri)
- {
- if(li>r || ri<l) return -INF;
- if(li>=l && ri<=r) return t[v];
- int a1=getm(2*v,l,r,li,(li+ri)/2),
- a2=getm(2*v+1,l,r,(li+ri)/2+1,ri);
- return max(a1,a2);
- }
- int get(int v,int l,int r,int li,int ri)
- {
- if(li>r || ri<l) return 0;
- if(li>=l && ri<=r) return ts[v];
- int a1=get(2*v,l,r,li,(li+ri)/2),
- a2=get(2*v+1,l,r,(li+ri)/2+1,ri);
- return a1+a2;
- }
- int x[100005],y[100005],n;
- int a[100005],b[100005];
- int calc(int i)
- {
- if(i==1 || i==n) return a[i]=-INF;
- return a[i]=kabs(x[i]-x[i+1])+kabs(y[i]-y[i+1])+kabs(x[i]-x[i-1])+kabs(y[i]-y[i-1])-kabs(x[i-1]-x[i+1])-kabs(y[i-1]-y[i+1]);
- }
- int calcd(int i)
- {
- if(i==n)return b[i]=0;
- return b[i]=kabs(x[i]-x[i+1])+kabs(y[i]-y[i+1]);
- }
- int main()
- {
- freopen("marathon.in","r",stdin);
- freopen("marathon.out","w",stdout);
- int m,i,p=1;
- scanf("%d %d",&n,&m);
- for(i=1;i<=n;++i)
- {
- scanf("%d %d",&x[i],&y[i]);
- }
- for(i=1;i<=n;++i)
- {
- calc(i);
- calcd(i);
- }
- while(p<n)
- p*=2;
- for(i=p;i<p+n;++i)
- {
- ts[i]=b[i-p+1];
- t[i]=a[i-p+1];
- }
- for(i=p+n;i<p+p;++i)
- t[i]=-INF;
- for(i=p-1;i>0;--i)
- {
- ts[i]=ts[2*i]+ts[2*i+1];
- t[i]=max(t[2*i],t[2*i+1]);
- }
- while(m--)
- {
- char c;
- scanf(" %c",&c);
- if(c=='U')
- {
- int ind;
- scanf("%d",&ind);
- scanf("%d %d",&x[ind],&y[ind]);
- if(ind!=1)
- update(p+ind-2,calcd(ind-1));
- if(ind!=n)
- update(p+ind-1,calcd(ind));
- if(ind!=1)
- updatem(p+ind-2,calc(ind-1));
- updatem(p+ind-1,calc(ind));
- if(ind!=n)
- updatem(p+ind,calc(ind+1));
- }
- else
- {
- int l,r;
- scanf("%d %d",&l,&r);
- if(r==l)
- printf("0\n");
- else if(r==l+1)
- printf("%d\n",ts[l+p-1]);
- else
- {
- int pr=get(1,p+l-1,p+r-2,p,p+p-1)-getm(1,p+l,p+r-2,p,p+p-1),pr1=get(1,p+l-1,p+r-2,p,p+p-1);
- if(pr1<pr)pr=pr1;
- printf("%d\n",pr);
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement