随机化主席树写挂了,求助qwq
查看原帖
随机化主席树写挂了,求助qwq
685034
dqo_opb楼主2023/8/25 17:07
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128 lll;
const int N=3e5+7;
mt19937_64 Rand(355);
inline int read(){
    int x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
    for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-'0';
    return x*f;
}
int n,q,idx;
int col[N];
ull key[N*40];
int dep[N],top[N],fa[N],root[N],bigson[N],siz[N];
int head[N<<1],cnt;
struct node{
    ull sum,key;
    int ls,rs;
}tr[N*40];
struct edge{
    int to,next;
}e[N<<1];
inline void newnode(int pos,int pre){
    tr[pos] = tr[pre];
}
inline void addedge(int from,int to){
    e[++cnt]=(edge){to,head[from]};
    head[from]=cnt;
}
inline int query(int a,int b,int c,int d,int l,int r,int L,int R){
    if(!(tr[a].sum^tr[b].sum^tr[c].sum^tr[d].sum))return -1;
    if(l==r)return l;
    int mid=(l+r)>>1,ret=-1;
    if(l<=mid){
        ret = query(tr[a].ls,tr[b].ls,tr[c].ls,tr[d].ls,l,mid,L,R);
        if(ret!=-1)return ret;
    }
    if(r>mid){
        ret = query(tr[a].rs,tr[b].rs,tr[c].rs,tr[d].rs,mid+1,r,L,R);
        if(ret!=-1)return ret;
    }
    return -1;
}
inline void insert(int pos,int pre,int l,int r,int wz,ull val){
    newnode(pos,pre);
    tr[pos].sum^=val;
    if(l==r)return;
    int mid=(l+r)>>1;
    if(wz <= mid)insert(tr[pos].ls,tr[pos].rs,l,mid,wz,val);
    else insert(tr[pos].rs,tr[pos].rs,mid+1,r,wz,val);
}
inline void dfs1(int x){
    insert(root[x],root[fa[x]],1,n,col[x],tr[col[x]].key);
    siz[x]=1;
    for(int i=head[x];i;i=e[i].next){
        int to=e[i].to;
        if(to == fa[x])continue;
        dep[to] = dep[x] + 1;
        fa[to] = x;
        dfs1(to);
        siz[x] += siz[to];
        if(siz[x] > siz[bigson[x]])
            bigson[x] = to;
    }
}

inline void dfs2(int x){
    if(bigson[x]){
        top[bigson[x]] = top[x];
        dfs2(bigson[x]); 
    }
    for(int i=head[x];i;i=e[i].next){
        int to=e[i].to;
        if(to == fa[x] || to == bigson[x])continue;
        top[to] = to;
        dfs2(to);
    }
}

inline int lca(int u,int v){
    while(top[u] != top[v]){
        if(dep[top[u]] < dep[top[v]] )std::swap(u,v);
        u = fa[top[u]];
    }
    if(dep[u] < dep[v])std::swap(u,v);
    return v;
}

int main(){
    n=read();
    q=read();
    for(int i=1;i<=n;i++){
        col[i]=read();
        tr[i].key=Rand();
    }
    for(int i=1;i<n;i++){
        int u=read(),v=read();
        addedge(u,v);
        addedge(v,u);
    }
    dfs1(1);
    top[1]=1;
    dfs2(1);
    while(q--){
        int u=read(),v=read(),l=read(),r=read();
        int LCA=lca(u,v);
        printf("%d\n",query(root[u],root[v],root[LCA],root[fa[LCA]],1,n,l,r));
    }
    return 0;
}
2023/8/25 17:07
加载中...