神犇学弟说LCA要用LCT求,于是我就听他的话写了一个LCT~
Code:
#include <bits/stdc++.h> #define N 500005 #define lson t[x].ch[0] #define rson t[x].ch[1] #define setIO(s) freopen(s".in","r",stdin) ,freopen(s".out","w",stdout) using namespace std; int edges; int sta[N],hd[N<<1],nex[N<<1],to[N<<1],dep[N]; void add(int u,int v) { nex[++edges]=hd[u],hd[u]=edges,to[edges]=v; } struct Node { int ch[2],f,val,rev; }t[N]; int isrt(int x) { return !(t[t[x].f].ch[0]==x||t[t[x].f].ch[1]==x); } int get(int x) { return t[t[x].f].ch[1]==x; } void mark(int x,int d) { if(!x) return; t[x].val=d; } void markrev(int x) { if(!x) return; t[x].rev^=1,swap(lson,rson); } void pushdown(int x) { if(t[x].val) { if(lson) mark(lson, t[x].val); if(rson) mark(rson, t[x].val); } } void rotate(int x) { int old=t[x].f,fold=t[old].f,which=get(x); if(!isrt(old)) t[fold].ch[t[fold].ch[1]==old]=x; t[old].ch[which]=t[x].ch[which^1],t[t[old].ch[which]].f=old; t[x].ch[which^1]=old,t[old].f=x,t[x].f=fold; } void splay(int x) { int v=0,u=x,fa; for(sta[++v]=u;!isrt(u);u=t[u].f) sta[++v]=t[u].f; for(;v;--v) pushdown(sta[v]); for(u=t[u].f;(fa=t[x].f)!=u;rotate(x)) if(t[fa].f!=u) rotate(get(fa)==get(x)?fa:x); } void Access(int x,int tt) { for(int y=0;x;y=x,x=t[x].f) { splay(x); rson=y; t[x].val=tt; } } int Access2(int x,int tt) { int id=0; for(int y=0;x;y=x,x=t[x].f) { splay(x); if((!id&&t[x].val==tt)) id=x; rson=y; } return id; } void dfs(int u,int ff) { t[u].f=ff; dep[u]=dep[ff]+1; for(int i=hd[u];i;i=nex[i]) if(to[i]!=ff) dfs(to[i],u); } int main() { // setIO("input"); int n,m,s,i,j; scanf("%d%d%d",&n,&m,&s); for(i=1;i<n;++i) { int a,b; scanf("%d%d",&a,&b), add(a,b), add(b,a); } dfs(s,0); for(i=1;i<=m;++i) { int a,b; scanf("%d%d",&a,&b); Access(a,i); printf("%d\n",Access2(b,i)); } return 0; }