Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
33972 | liuyile | 【S】T2 | C++ | 解答错误 | 85 | 461 MS | 46396 KB | 3202 | 2024-11-01 14:15:46 |
#include<bits/stdc++.h> using namespace std; #define int long long #define endl "\n" int n,q; int l[200300],r[200300],siz[200300]; int mn[200300<<2],ct[200300<<2]; int dfn[200300],loc[200300]; int hs[200300],tp[200300]; int tg[200300<<2],fa[200300]; int bid[200300]; int lstrfa[200300]; int a[200300]; #define lc(x) (x<<1) #define rc(x) (x<<1|1) inline void upd(int x){ if(mn[lc(x)]==mn[rc(x)]){ mn[x]=mn[lc(x)]; ct[x]=ct[lc(x)]+ct[rc(x)]; } else if(mn[lc(x)]<mn[rc(x)]){ mn[x]=mn[lc(x)]; ct[x]=ct[lc(x)]; } else { mn[x]=mn[rc(x)]; ct[x]=ct[rc(x)]; } } inline void pd(int x){ if(tg[x]){ tg[lc(x)]+=tg[x]; mn[lc(x)]+=tg[x]; tg[rc(x)]+=tg[x]; mn[rc(x)]+=tg[x]; tg[x]=0; } } inline void bd(int x,int l,int r){ if(l==r){ mn[x]=siz[loc[l]]-1; ct[x]=1; // cout<<l<<" "<<mn[x]<<endl; return ; } int mid=l+r>>1; bd(lc(x),l,mid); bd(rc(x),mid+1,r); upd(x); } inline void mod(int x,int l,int r,int L,int R,int k){ // cerr<<x<<" "<<l<<" "<<r<<" "<<L<<" "<<R<<" "<<k<<endl; // cerr.flush(); if(L<=l&&r<=R){ mn[x]+=k; tg[x]+=k; // cout<<l<<" "<<r<<" "<<L<<" "<<R<<" "<<k<<" "<<mn[x]<<endl; return ; } pd(x); int mid=l+r>>1; if(L<=mid)mod(lc(x),l,mid,L,R,k); if(R>mid)mod(rc(x),mid+1,r,L,R,k); upd(x); } int id=0; int p[200300]; inline void dfs(int x){ if(!x)return ; siz[x]=1; if(l[x])fa[l[x]]=x,lstrfa[l[x]]=x; if(r[x])fa[r[x]]=x,lstrfa[r[x]]=lstrfa[x]; dfs(l[x]); bid[x]=++id; p[id]=x; dfs(r[x]); siz[x]=siz[l[x]]+siz[r[x]]+1; if(siz[l[x]]>siz[r[x]])hs[x]=l[x]; else hs[x]=r[x]; } int tk=0; inline void dfs2(int x,int t){ if(!x)return ; tp[x]=t; loc[dfn[x]=++tk]=x; dfs2(hs[x],t); if(l[x]!=hs[x])dfs2(l[x],l[x]); if(r[x]!=hs[x])dfs2(r[x],r[x]); } inline void mod(int x,int k){ if(!k)return ; // cout<<x<<"?"; if(!r[x]) x=lstrfa[x]; // cout<<x<<" "<<tp[x]<<endl; while(x){ mod(1,1,n,dfn[tp[x]],dfn[x],k); x=fa[tp[x]]; } } inline int chk(int x){ return a[x]<=a[p[bid[x]+1]]; } inline void moda(int x,int y){ int r=chk(x); int z=p[bid[x]-1]; int rp=chk(z); a[x]=y; r-=chk(x); rp-=chk(z); mod(x,r); if(z)mod(z,rp); } signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); // freopen("genshin.in","r",stdin); // freopen("genshin.out","w",stdout); cin>>n>>q; for(int i=1;i<=n;i++)cin>>l[i]>>r[i]; dfs(1); dfs2(1,1); for(int i=1;i<=n;i++)cin>>a[i]; // for(int i=1;i<=n;i++) // cout<<bid[i]<<" "; // cout<<endl;; bd(1,1,n); for(int i=1;i<n;i++) if(chk(i))mod(i,-1); // return 0; while(q--){ int x,y; cin>>x>>y; moda(x,y); if(mn[1]==0)cout<<ct[1]<<endl; else cout<<0<<endl; assert(mn[1]>=0); } cout.flush(); return 0; }