MnZn 刚学树剖,36 pt RE on #1 ~#4 求条
查看原帖
MnZn 刚学树剖,36 pt RE on #1 ~#4 求条
749665
huta0楼主2024/12/8 10:24
#include <iostream>
#include <vector>
#include <algorithm>
#define ai_jiang signed main()
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define drep(a,b,c) for(int a=b;a>=c;a--)
#define all(a) a.begin(),a.end()
#define id(x) ((lower_bound(a.begin(),a.end(),x)-a.begin())+1)
#define ll long long
using namespace std;
using poly=vector<ll>;
namespace ai {
    constexpr int N = 1e5+5;
    int n,m,w[N],dfn[N],fa[N],top[N],siz[N],hs[N],dep[N],rt[N<<1],tot,nodetot,lst,x,y,lca;
    vector<int> e[N];
    vector<int> a;
    void dfs1(int u,int f) {
        fa[u]=f;
        dep[u]=dep[f]+1;
        dfn[u]=++tot;
        siz[u]=1;
        for(auto v:e[u]) {
            if(v==f) continue;
            dfs1(v,u);
            siz[u]+=siz[v];
            if(siz[v]>siz[hs[u]]) hs[u]=v;
        }
    }
    void dfs2(int u,int t) {
        top[u]=t;
        if(!hs[u]) return;
        dfs2(hs[u],t);
        for(auto v:e[u]) {
            if(v==fa[u]||v==hs[u]) continue;
            dfs2(v,v);
        }
    }
    int la(int x,int y) {
        while(dep[top[x]]!=dep[top[y]]) {
            if(dep[top[x]]<dep[top[y]]) swap(x,y);
            x=fa[top[x]];
        } return dep[x]<dep[y]?x:y;
    }

    struct node {
        int v,s[2];
    } tr[N*(__lg(N)+2)];
    #define lc(x) tr[x].s[0]
    #define rc(x) tr[x].s[1]
    void insert(int x,int &y,int l,int r,int v) {
        y=++nodetot; tr[y]=tr[x]; tr[y].v++;
        if(l==r) return;
        int mid=l+r>>1;
        if(v<=mid) insert(lc(x),lc(y),l,mid,v);
        else insert(rc(x),rc(y),mid+1,r,v);
    }
    int qry(int x,int l,int r,int L,int R) {
        if(L<=l&&r<=R) return tr[x].v;
        int mid=l+r>>1;
        if(L<=mid) return qry(lc(x),l,mid,L,R);
        if(R>mid) return qry(rc(x),mid+1,r,L,R);
    }
    int query(int p,int l,int r,int k) {
        if(l==r) return a[l-1];
        int mid=l+r>>1;
        int s=qry(rt[dfn[x]],1,a.size(),l,mid)-qry(rt[dfn[fa[lca]]],1,a.size(),l,mid)+qry(rt[dfn[y]],1,a.size(),l,mid)-qry(rt[dfn[lca]],1,a.size(),l,mid);
        if(k<=s) return query(lc(p),l,mid,k);
        else return query(rc(p),mid+1,r,k-s);
    }
    void dfs(int u,int f) {
        insert(rt[dfn[f]],rt[dfn[u]],1,a.size(),id(w[u]));
        for(auto v:e[u]) {
            if(v==f) continue;
            dfs(v,u);
        }
    }
}
using namespace ai;
ai_jiang {
    cin.tie(0); cout.tie(0);
    cin>>n>>m;
    rep(i,1,n) cin>>w[i],a.push_back(w[i]);
    sort(all(a));
    a.erase(unique(a.begin(),a.end()),a.end());
    rep(i,1,n-1) {
        int xx,yy; cin>>xx>>yy;
        e[xx].push_back(yy);
        e[yy].push_back(xx);
    }
    dfs1(1,0);
    dfs2(1,1);
    dfs(1,0);
    rep(i,1,m) {
        int u,v,k;
        cin>>u>>v>>k; u^=lst; x=u,y=v,lca=la(x,y);
        cout<<(lst=query(1,1,a.size(),k))<<'\n';
    }
    return 0;
}
2024/12/8 10:24
加载中...