splay和我的常数加到一起简直是灾难。。。
坐标没有用,把它离散掉。
然后splay维护一个最大值和次大值和最大size的标记。
插入的时候查询一下,打个标记。
#includeusing namespace std; #define N 410000 #define M 810000 #define ll long long #define ls(x) ch[x][0] #define rs(x) ch[x][1] #define which(x) (ch[fa[x]][1]==x) #define icmp(x,y) (x^y ? v[x]^v[y] ? v[x]>v[y] ? 1:-1 : x>y ? 1:-1 :0) const int inf=~0U>>1; int n,m,cnt,tot; int v[M],a[N],av[M],as[M],rem[N],root[N]; int size[M],L[N],R[N],l,r; ll val[N],pos[N],org[N]; int ch[M][2],fa[M],mx[M],sx[M],sum[M]; char getc() { static const int LEN = 4096; static char buf[LEN],*S=buf,*T=buf; if(S == T) { T = (S=buf)+fread(buf,1,LEN,stdin); if(S == T)return EOF; } return *S++; } int read() { static char ch; static int D; while(!isdigit(ch=getc())); for(D=ch-'0'; isdigit(ch=getc());) D=(D<<3)+(D<<1)+(ch-'0'); return D; } void upd(int x) { as[x]=max(as[x],sum[x]); int t=mx[x]==x ? sx[x]:mx[x]; if(v[t]>v[av[x]])av[x]=t; } void cal(int x,int y) { if(!x||!y||mx[x]==y||sx[x]==y)return; if(v[y]>v[mx[x]])sx[x]=mx[x],mx[x]=y; else if(v[y]>v[sx[x]])sx[x]=y; } void pushdown(int x) { if(sum[x]) { sum[ls(x)]=max(sum[ls(x)],sum[x]); sum[rs(x)]=max(sum[rs(x)],sum[x]); } cal(ls(x),mx[x]);cal(rs(x),mx[x]); cal(ls(x),sx[x]);cal(rs(x),sx[x]); upd(ls(x));upd(rs(x)); mx[x]=sx[x]=0;sum[x]=0; } void pushup(int x) {size[x]=size[ls(x)]+size[rs(x)]+1;} void down(int x) { if(fa[x])down(fa[x]); pushdown(x); } void rotate(int x) { int y=fa[x],k=which(x); ch[y][k]=ch[x][k^1]; ch[x][k^1]=y; ch[fa[y]][which(y)]=x; fa[x]=fa[y];fa[y]=x; fa[ch[y][k]]=y; pushup(y);pushup(x); } void splay(int x,int tar) { down(x); while(fa[x]!=tar) { int y=fa[x]; if(fa[y]==tar)rotate(x); else { if(which(x)^which(y))rotate(x); else rotate(y); rotate(x); } } } void pre(int x,int y) { if(!x)return; if(icmp(x,y)<0) { if(icmp(x,l)>0)l=x; pre(ch[x][1],y); } else pre(ch[x][0],y); } void nex(int x,int y) { if(!x)return; if(icmp(x,y)>0) { if(icmp(x,r)<0)r=x; nex(ch[x][0],y); } else nex(ch[x][1],y); } int find(int x,int K) { int t=size[ch[x][0]]; if(t+1==K)return x; if(t>=K)return find(ch[x][0],K); return find(ch[x][1],K-t-1); } void build(int x,int y,int pos) { root[pos]=x; L[pos]=x;R[pos]=y; ch[x][1]=y;v[x]=-1;v[y]=inf; fa[y]=x;size[x]=2;size[y]=1; } void del(int pos,int x) { int &rt=root[pos]; l=L[pos];r=R[pos]; pre(rt,x);nex(rt,x); splay(l,0);rt=l;splay(r,l); size[l]--;size[r]--; ch[r][0]=fa[x]=0; } void ins(int pos,int x) { int &rt=root[pos]; if(size[rt]>2) { int t=find(rt,size[rt]-1); if(icmp(t,av[x])>0)av[x]=t; } l=L[pos];r=R[pos]; pre(rt,x);nex(rt,x); splay(l,0);rt=l;splay(r,l); size[l]++;size[r]++; ch[r][0]=x;fa[x]=r;size[x]=1; cal(rt,x);sum[rt]=max(sum[rt],size[rt]-3); upd(rt); } int main() { n=read(); for(int i=1,x,y;i<=n;i++) { v[i]=read();x=read();y=read(); org[i]=val[++cnt]=(ll)x*inf+y; } m=read(); for(int i=1,x,y;i<=m;i++) { a[i]=read();x=read();y=read(); pos[i]=val[++cnt]=(ll)x*inf+y; } sort(val+1,val+1+cnt); cnt=unique(val+1,val+1+cnt)-val-1; tot=n; for(int i=1;i<=cnt;i++) build(tot+1,tot+2,i),tot+=2; for(int i=1;i<=n;i++) { org[i]=lower_bound(val+1,val+1+cnt,org[i])-val; ins(org[i],i); } for(int i=1,t;i<=m;i++) { t=a[i];del(org[t],t); pos[i]=lower_bound(val+1,val+1+cnt,pos[i])-val; org[t]=pos[i];ins(org[t],t); } for(int i=1;i<=n;i++) { down(i); printf("%lld\n",(ll)v[av[i]]*as[i]); } return 0; }