MnZn 刚学主席树 wa on 2 求条 qwp
查看原帖
MnZn 刚学主席树 wa on 2 求条 qwp
749665
huta0楼主2025/1/3 20:30
#include <iostream>
#include <vector>
#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 ll long long
#define id(x) ((lower_bound(all(a),x)-a.begin())+1)
using namespace std;
using poly=vector<ll>;
namespace ai {
    constexpr int N = 1e5+5;
    int n,root,m,l,r,lans,dtot,mxdep,rt[N],a[N],dfn[N],dep[N],siz[N],tot;
    vector<int> e[N];
    vector<int> depp[N];
    struct node { int l,r,s[2],mn=2e9; } tr[N*(__lg(N)+2)];
    #define lc(x) tr[x].s[0]
    #define rc(x) tr[x].s[1]
    void dfs(int u,int f) {
        dfn[u]=++dtot;
        dep[u]=dep[f]+1;
        siz[u]=1;
        mxdep=max(mxdep,dep[u]);
        depp[dep[u]].push_back(u);
        for(auto v:e[u]) {
            if(v==f) continue;
            dfs(v,u);
            siz[u]+=siz[v];
        }
    }
    void pushup(int x) { tr[x].mn=min(tr[lc(x)].mn,tr[rc(x)].mn); }
    void modify(int x,int &y,int l,int r,int df,int v) {
        y=++tot; tr[y]=tr[x];
        if(l==r) { tr[y].mn=v; return; }
        int mid=l+r>>1;
        if(df<=mid) modify(lc(x),lc(y),l,mid,df,v);
        else modify(rc(x),rc(y),mid+1,r,df,v);
        pushup(y);
    }
    void mf2(int x,int l,int r,int df,int v) {
        if(l==r) { tr[x].mn=v; return; }
        int mid=l+r>>1;
        if(df<=mid) mf2(lc(x),l,mid,df,v);
        else mf2(rc(x),mid+1,r,df,v);
        pushup(x);
    }
    int query(int x,int l,int r,int L,int R) {
        if(L<=l&&r<=R) return tr[x].mn;
        int mid=l+r>>1,ans=2e9;
        if(L<=mid) ans=min(ans,query(lc(x),l,mid,L,R));
        if(R>mid) ans=min(ans,query(rc(x),mid+1,r,L,R));
        return ans; 
    }
}
using namespace ai;
ai_jiang {
    cin.tie(0); cout.tie(0);
    cin>>n>>root;
    rep(i,1,n) cin>>a[i];
    rep(i,1,n-1) {
        int aa,bb; cin>>aa>>bb;
        e[aa].push_back(bb);
        e[bb].push_back(aa);
    } dfs(root,0);
    rep(i,1,n) {
        if(!depp[i].size()) break;
        modify(rt[i-1],rt[i],1,n,dfn[depp[i][0]],a[depp[i][0]]);
        for(int j=1;j<depp[i].size();j++)
            mf2(rt[i],1,n,dfn[depp[i][j]],a[depp[i][j]]);    
    }
    cin>>m;
    rep(i,1,m) {
        cin>>l>>r; l=(l+lans)%n+1; r=(r+lans)%n;
        cout<<(lans=query(rt[min(mxdep,dep[l]+r)],1,n,dfn[l],dfn[l]+siz[l]-1))<<'\n';
    }
    return 0;
}
2025/1/3 20:30
加载中...