提交时间:2024-08-28 19:27:33

运行 ID: 31975

#include<bits/stdc++.h> using namespace std; #define int long long #define lson pos<<1 #define rson pos<<1|1 #define pii pair<int,int> #define fr first #define sc second #define inx int I=h[u],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}x=c-'0';c=getchar();while(c<='9'&&c>='0'){x*=10;x+=c-'0';c=getchar();}return x*f;} const int MAXN=500010,Mod=998244353,inf=1000000000; int Pow(int x,int y){int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod;y>>=1;}return rt;} int n,q,a[MAXN]; struct Edge{int v,nx;}edge[MAXN<<1];int h[MAXN],CNT;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;edge[++CNT]={u,h[v]};h[v]=CNT;} struct node{ int x,y1,y2; node operator*(const node&G)const{ if(x==G.x)return (node){x,y1+G.y1,y2+G.y2}; else return x<G.x?(node){x,y1,y2}:(node){G.x,G.y1,G.y2}; } }; struct segtree{ node t[MAXN<<2]; int lzx[MAXN<<2],lzy[MAXN<<2]; void pushup(int pos){ t[pos]=t[lson]*t[rson]; } void pushdown(int pos){ if(lzx[pos]){ lzx[lson]+=lzx[pos],lzx[rson]+=lzx[pos]; t[lson].x+=lzx[pos],t[rson].x+=lzx[pos]; lzx[pos]=0; } if(lzy[pos]){ lzy[lson]+=lzy[pos],lzy[rson]+=lzy[pos]; t[lson].y1+=lzy[pos]*t[lson].y2,t[rson].y1+=lzy[pos]*t[rson].y2; lzy[pos]=0; } } void build(int pos,int l,int r){ if(l==r){ t[pos]={0,0,1}; return; } int mid=(l+r)>>1; build(lson,l,mid);build(rson,mid+1,r); pushup(pos); } void update(int pos,int l,int r,int ql,int qr,int x,int y){ if(ql<=l&&qr>=r){ lzx[pos]+=x,lzy[pos]+=y; t[pos].x+=x,t[pos].y1+=y*t[pos].y2; return; } pushdown(pos); int mid=(l+r)>>1; if(ql<=mid)update(lson,l,mid,ql,qr,x,y); if(qr>mid)update(rson,mid+1,r,ql,qr,x,y); pushup(pos); } node query(int pos,int l,int r,int ql,int qr){ if(ql<=l&&qr>=r)return t[pos]; pushdown(pos); int mid=(l+r)>>1;node tmp={inf,0}; if(ql<=mid)tmp=query(lson,l,mid,ql,qr); if(qr>mid)tmp=tmp*query(rson,mid+1,r,ql,qr); return tmp; } void prt(int pos,int l,int r){ cout<<l<<" "<<r<<" "<<t[pos].x<<" "<<t[pos].y1<<" "<<t[pos].y2<<endl; if(l==r){ return; } int mid=(l+r)>>1; pushdown(pos); prt(lson,l,mid);prt(rson,mid+1,r); } void prtx(int pos,int l,int r){ if(l==r){ cout<<t[pos].x<<" "; return; } int mid=(l+r)>>1; pushdown(pos); prtx(lson,l,mid);prtx(rson,mid+1,r); } void prty(int pos,int l,int r){ if(l==r){ cout<<t[pos].y1<<"."<<t[pos].y2<<" "; return; } int mid=(l+r)>>1; pushdown(pos); prty(lson,l,mid);prty(rson,mid+1,r); } }T; int fa[MAXN],dep[MAXN]; void dfs(int u,int lst){ fa[u]=lst; for(inx)if(v!=lst){ dep[v]=dep[u]+1; dfs(v,u); } } void slv(){ n=read(),q=read(); for(int i=1;i<n;i++){ int u=read(),v=read(); add_side(u,v); } for(int i=1;i<=n;i++)a[read()]=i; dfs(1,1); T.build(1,1,n); for(int i=2;i<=n;i++){ if(a[fa[i]]<a[i])T.update(1,1,n,a[fa[i]],a[i]-1,1,0);//,cout<<'x'<<a[fa[i]]<<" "<<a[i]-1<<" "<<i<<" "<<fa[i]<<endl; else T.update(1,1,n,a[i],a[fa[i]]-1,0,1);//,cout<<'y'<<a[i]<<" "<<a[fa[i]]-1<<" "<<i<<" "<<fa[i]<<endl; } while(q--){ int u1=read(),v1=read(),u2=read(),v2=read(); if(fa[v1]==u1)swap(u1,v1); if(v2==u1)swap(u2,v2); // cout<<"FA:";for(int i=1;i<=n;i++)cout<<fa[i]<<" ";cout<<endl; // T.prt(1,1,n);T.prtx(1,1,n);cout<<endl;T.prty(1,1,n);cout<<endl; if(a[fa[u1]]<a[u1])T.update(1,1,n,a[fa[u1]],a[u1]-1,-1,0); else T.update(1,1,n,a[u1],a[fa[u1]]-1,0,-1);//,cout<<"-"<<a[u1]<<" "<<a[fa[u1]]<<endl; fa[u1]=v2; if(a[fa[u1]]<a[u1])T.update(1,1,n,a[fa[u1]],a[u1]-1,1,0); else T.update(1,1,n,a[u1],a[fa[u1]]-1,0,1);//,cout<<"+"<<a[u1]<<" "<<a[fa[u1]]<<endl; // T.prt(1,1,n);T.prtx(1,1,n);cout<<endl;T.prty(1,1,n);cout<<endl; node tmp=T.query(1,1,n,1,n); printf("%lld\n",tmp.y1+1); } } signed main(){ slv(); return 0; }