感觉考试的时候智商约等于0 QAQ
直接把链剖出来的区间取反再更新就好了
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int N=200000+5; #define rep(i,l,r) for(int i=l;i<=r;i++) typedef priority_queue<int> heap; struct Twoheap{ heap h,d; void push(int x){h.push(x);} void del(int x){d.push(x);} int top(){while(!d.empty()&&d.top()==h.top())d.pop(),h.pop();return h.top();} }; struct Edge{int to,next;}e[N<<1]; int head[N],cnt; void ins(int u,int v){e[++cnt]=(Edge){v,head[u]};head[u]=cnt;} void insert(int u,int v){ins(u,v);ins(v,u);} struct Node{ int l,r; Twoheap h; }tr[N<<2]; #define lc o<<1 #define rc o<<1|1 void update(int o,int a,int b,int v,bool flag){ int l=tr[o].l,r=tr[o].r; if(a<=l&&r<=b)flag?tr[o].h.push(v):tr[o].h.del(v); else{ int mid=l+r>>1; if(a<=mid)update(lc,a,b,v,flag); if(mid<b)update(rc,a,b,v,flag); } } int query(int o,int p){ int l=tr[o].l,r=tr[o].r; if(l==r)return tr[o].h.top(); else{ int mid=l+r>>1; if(p<=mid)return max(query(lc,p),tr[o].h.top()); else return max(query(rc,p),tr[o].h.top()); } } void build(int o,int l,int r){ tr[o].l=l;tr[o].r=r;tr[o].h.push(-1); if(l==r)return; int mid=l+r>>1; build(lc,l,mid);build(rc,mid+1,r); } int fa[N],son[N],siz[N],dep[N],top[N],pos[N],sz; void dfs(int u){ siz[u]=1; for(int i=head[u];i;i=e[i].next){ int v=e[i].to;if(v==fa[u])continue; fa[v]=u;dep[v]=dep[u]+1;dfs(v); siz[u]+=siz[v];if(siz[v]>siz[son[u]])son[u]=v; } } void dfs(int u,int tp){ pos[u]=++sz;top[u]=tp; if(son[u])dfs(son[u],tp); for(int i=head[u];i;i=e[i].next){ int v=e[i].to; if(v!=son[u]&&v!=fa[u])dfs(v,v); } } struct chain_interval{ int l,r; bool operator<(const chain_interval &x)const{ return l<x.l; } }ch[N]; int tot; void add_chain(int l,int r){ch[++tot]=(chain_interval){l,r};} void depart(int u,int v){ tot=0; while(top[u]!=top[v]){ if(dep[top[u]]<dep[top[v]])swap(u,v); add_chain(pos[top[u]],pos[u]); u=fa[top[u]]; } if(dep[u]>dep[v])swap(u,v); add_chain(pos[u],pos[v]); } void update(int u,int v,int w,bool flag){ depart(u,v); sort(ch+1,ch+1+tot); if(ch[1].l!=1)update(1,1,ch[1].l-1,w,flag); rep(i,2,tot)update(1,ch[i-1].r+1,ch[i].l-1,w,flag); if(ch[tot].r!=sz)update(1,ch[tot].r+1,sz,w,flag); } int w[N],x[N],y[N]; int read(){ char ch=getchar();int x=0,f=1; while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int main(){ //freopen("a.in","r",stdin); int n,m;n=read();m=read(); rep(i,2,n){int u,v;u=read();v=read();insert(u,v);} dfs(1);dfs(1,1);build(1,1,sz); rep(i,1,m){ int k=read(); if(k==0){x[i]=read();y[i]=read();w[i]=read();update(x[i],y[i],w[i],1);} else if(k==1){k=read();update(x[k],y[k],w[k],0);} else{k=read();printf("%d\n",query(1,pos[k]));} } return 0; }