#include inline int read() { char op=getchar(); int x=0; while(op<'0'||op>'9') op=getchar(); while(op>='0'&&op<='9') { x=x*10+op-'0'; op=getchar(); } return x; } int N,Q,ct,dep[500009],hd[500009],to[1000009],nxt[1000009],k,st[500009][19],tt[500009], as[500009],f[500009],top[500009],pa[500009],son[500009],siz[500009],ls[500009], rs[500009],sc[500009],ll[500009],rr[500009],anc[500009][19],seg[2000009]; #define md ((l+r)>>1) void up(int n,int l,int r,int p,int v) { seg[n]=std::max(seg[n],v); if(l==r) return; if(p<=md) up((n<<1),l,md,p,v);else up((n<<1)+1,md+1,r,p,v); } int qv(int n,int l,int r,int L,int R) { if(ry.k; } bool cmp(n_t x,n_t y) { return x.r-x.l+1>y.r-y.l+1; } void l(int u,int v) { to[++k]=v;nxt[k]=hd[u];hd[u]=k; } inline int qr(int l,int r) { int x=tt[r-l+1]; return std::min(st[l][x],st[r-(1<dep[y]) std::swap(x,y); return x; } void dfs(int a,int l,int r) { ll[a]=l; rr[a]=r; hh[++ct]=(n_t){a,l,r}; if(ls[a]) { dep[ls[a]]=dep[a]+1; dfs(ls[a],l,a-1); } if(rs[a]) { dep[rs[a]]=dep[a]+1; dfs(rs[a],a+1,r); } } void dfs1(int n,int f) { pa[n]=f;siz[n]=1;dep[n]=dep[f]+1; for(int i=hd[n];i;i=nxt[i]) { if(to[i]==f) continue; dfs1(to[i],n); siz[n]+=siz[to[i]]; if(siz[son[n]]f[i]) { k--; } if(k=q[i].k) { le++; int x=hh[le].v; up(1,1,N,x,f[x]); } int x=q[i].l,y=q[i].r,ans=0,tp=q[i].k; for(int j=18;j>=0;j--) { int qq=anc[x][j]; if(qq&&rr[qq]-q[i].l+1=0;j--) { int qq=anc[y][j]; if(qq&&q[i].r-ll[qq]+1