1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #include <bits/stdc++.h> using namespace std; const int N=100100,M=4000010; #define int long long using ll=long long; using pii=pair<ll,ll>; int T,n,m; ll X[N],Y[N],C[N]; struct node{ pii mx,mx2,mn,mn2; }a[M]; int idx,ls[M],rs[M],rtA,rtB; const pii inf_max={-1e18,0},inf_min={1e18,0}; pii Max(pii x,pii y,int c){ if(x.second==c&&y.second==c)return inf_max; if(x.second==c)return y; if(y.second==c)return x; return x.first>y.first?x:y; } pii Min(pii x,pii y,int c){ if(x.second==c&&y.second==c)return inf_min; if(x.second==c)return y; if(y.second==c)return x; return x.first<y.first?x:y; } node up(node l,node r){ node p; if(l.mx.first>r.mx.first)p.mx=l.mx,p.mx2=Max(r.mx,Max(l.mx2,r.mx2,l.mx.second),l.mx.second); else p.mx=r.mx,p.mx2=Max(l.mx,Max(l.mx2,r.mx2,r.mx.second),r.mx.second); if(l.mn.first<r.mn.first)p.mn=l.mn,p.mn2=Min(r.mn,Min(l.mn2,r.mn2,l.mn.second),l.mn.second); else p.mn=r.mn,p.mn2=Min(l.mn,Min(l.mn2,r.mn2,r.mn.second),r.mn.second); return p; } void insert(int &p,int l,int r,int x,int y,int z){ if(!p)p=++idx,a[p]={inf_max,inf_max,inf_min,inf_min}; if(l==r){ a[p].mx=a[p].mn={y,z}; return ; } int mid=(l+r)>>1; if(mid>=x)insert(ls[p],l,mid,x,y,z); else insert(rs[p],mid+1,r,x,y,z); a[p]=up(a[ls[p]],a[rs[p]]); } node query(int p,int l,int r,int ql,int qr){ if(!p)return {inf_max,inf_max,inf_min,inf_min}; if(ql<=l&&r<=qr)return a[p]; int mid=(l+r)>>1; if(mid>=ql&&mid<qr)return up(query(ls[p],l,mid,ql,qr),query(rs[p],mid+1,r,ql,qr)); if(mid>=ql)return query(ls[p],l,mid,ql,qr); return query(rs[p],mid+1,r,ql,qr); } ll calc(node p){ if(p.mx.second!=p.mn.second)return p.mx.first-p.mn.first; ll t=max(p.mx.first-p.mn2.first,p.mx2.first-p.mn.first); return max(0ll,t); } void WZH(int Case){ printf("Case #%lld:\n",Case); for(int i=0;i<=idx;i++)ls[i]=rs[i]=0; rtA=rtB=idx=0; scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++){ ll x,y,z; scanf("%lld%lld%lld",&x,&y,&z); insert(rtA,1,n,i,x+y,z); insert(rtB,1,n,i,x-y,z); X[i]=x,Y[i]=y,C[i]=z; } while(m--){ int opt,x,y;ll z; scanf("%lld%lld%lld",&opt,&x,&y); if(opt==1){ scanf("%lld",&z); X[x]+=y,Y[x]+=z; insert(rtA,1,n,x,X[x]+Y[x],C[x]); insert(rtB,1,n,x,X[x]-Y[x],C[x]); } if(opt==2){ C[x]=y; insert(rtA,1,n,x,X[x]+Y[x],C[x]); insert(rtB,1,n,x,X[x]-Y[x],C[x]); } if(opt==3){ node t1=query(rtA,1,n,x,y),t2=query(rtB,1,n,x,y); printf("%lld\n",max(calc(t1),calc(t2))); } } } signed main(){ a[0]={inf_max,inf_max,inf_min,inf_min}; scanf("%lld",&T); for(int i=1;i<=T;i++)WZH(i); return 0; }
|