- summer23006's blog
lhjs
- 2025-8-15 17:00:49 @
#include<bits/stdc++.h> #define auto set::iterator using namespace std; const int MAXN=3e5+5; struct node{ int x,y,l,r,id; }; int n,Q; int a[MAXN]; int dfn[2*MAXN]; int l[MAXN],r[MAXN]; int f[MAXN][30+5]; node q[MAXN]; int ans[MAXN]; bool cnt[MAXN]; int cnt=0; int block; set s; void dfs(int d,int fa){
} int main(){ scanf("%d%d",&n,&Q); block=sqrt(2*n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } for(int i=1;i<n;i++){ int x,y; scanf("%d%d",&x,&y); v[x].push_back(y); v[y].push_back(x); } dfs(1,0); for(int i=1;i<=Q;i++){ scanf("%d%d%d%d",&q[i].x,&q[i].y,&q[i].l,&q[i].r); q[i].id=i; } sort(q+1,q+1+Q,cmp); int l=1,r=0; for(int i=1;i<=Q;i++){ int ql,qr; if(r[q[i].x]>r[q[i].y]){ swap(q[i].x,q[i].y); } if(r[q[i].x]<l[q[i].y]){ ql=r[q[i].x]; qr=l[q[i].y]; } else{ ql=r[q[i].x]; qr=r[q[i].x]; } while(ql<l){ add(dfn[--l]); } while(qr>r){ add(dfn[++r]); } while(ql>l){ add(dfn[l++]); } while(qr<r){ add(dfn[r--]); } if(r[q[i].x]<l[q[i].y]){ add(lca(q[i].x,q[i].y)); auto it=s.lower_bound(q[i].l); if(its.end()||*it>q[i].r){ ans[q[i].id]=-1; } else{ ans[q[i].id]=*it; } del(lca(q[i].x,q[i].y)) } else{ auto it=s.lower_bound(q[i].l); if(its.end()||*it>q[i].r){ ans[q[i].id]=-1; } else{ ans[q[i].id]=*it; } } } }