#include<bits/stdc++.h> using namespace std; #define ls (rt<<1) #define rs (rt<<1|1) #define mid ((l+r)>>1) const int N= int(1e5)+17; typedef long long ll; int n,q,cnt=0; ll vis[N],sta[N],_end[N],id[N],idd[N],a[N],f[N]; vector<int>e[N]; struct node{ ll lz,cnt,mi; friend node operator + (node x,node y){ if(x.mi==y.mi) return (node){0,x.cnt+y.cnt,x.mi}; else if(x.mi<y.mi) return (node){0,x.cnt,x.mi}; else return (node){0,y.cnt,y.mi}; } }t[N<<2]; void pd(int rt){ t[ls].lz+=t[rt].lz;t[rs].lz+=t[rt].lz; t[ls].mi+=t[rt].lz;t[rs].mi+=t[rt].lz; t[rt].lz=0; } void pushup(int rt){ t[rt]=t[ls]+t[rs]; } void add(int rt,int l,int r,int ql,int qr,ll val){ if(ql<=l&&r<=qr){ t[rt].lz+=val; t[rt].mi+=val; return; } pd(rt); if(ql<=mid) add(ls,l,mid,ql,qr,val); if(mid<qr) add(rs,mid+1,r,ql,qr,val); pushup(rt); } void modify(int rt,int l,int r,int id,ll val){ if(l==r){ t[rt].cnt=val; return; } pd(rt); if(id<=mid) modify(ls,l,mid,id,val); else modify(rs,mid+1,r,id,val); pushup(rt); } void dfs(int u,int fa){ cnt++;sta[u]=cnt; id[cnt]=u;idd[u]=cnt; vis[u]=1; for(int i=0;i<e[u].size();i++){ int to=e[u][i]; if(to==fa||vis[to]) continue; dfs(to,u); } _end[u]=cnt; } void build(int rt,int l,int r){ if(l==r){ t[rt].mi=0; t[rt].cnt=a[id[l]]; t[rt].lz=0; return; } build(ls,l,mid);build(rs,mid+1,r); pushup(rt); } int main(){ std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); //freopen("lys.in","r",stdin); cin>>n>>q; for(int i=1;i<n;i++){ int u,v; cin>>u>>v;e[u].push_back(v);e[v].push_back(u); } for(int i=1;i<=n;i++) cin>>a[i]; dfs(1,0); build(1,1,n); for(int i=1;i<=q;i++){ int op; cin>>op; if(op==1){ int x,y;cin>>x>>y; modify(1,1,n,idd[x],y); } else { int x; cin>>x; if(f[x]==0) add(1,1,n,sta[x],_end[x],1); else add(1,1,n,sta[x],_end[x],-1); f[x]^=1; } if(t[1].mi==0) cout<<t[1].cnt<<endl; else cout<<0<<endl; } }
标签:node,AGM,资格赛,避难所,mi,cnt,else,int,ll From: https://www.cnblogs.com/liyishui2003/p/16717753.html