#include "Joi.h"
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10000;
const int MAXBIT=60;
int dsu[MAXN];
vector<vector<int>> graph;
vector<vector<int>> comp;
int num[MAXN];
bool in[MAXN];
int Findset(int i){
    if(dsu[i]<0){
        return i;
    }
    int root=Findset(dsu[i]);
    dsu[i]=root;
    return root;
}
void unite(int u,int v){
    u=Findset(u),v=Findset(v);
    if(u==v){
        return;
    }
    if(dsu[u]<dsu[v]){
        swap(u,v);
    }
    dsu[v]+=dsu[u];
    dsu[u]=v;
}
void setup(int u,int p){
    comp[0].push_back(u);
    if(comp[0].size()==MAXBIT){
        return;
    }
    for(int v:graph[u]){
        if(v!=p){
            setup(v,u);
            if(comp[0].size()==MAXBIT){
                return;
            }
        }
    }
}
int getleaf(int u,int p){
    for(int v:graph[u]){
        if(v!=p&&in[v]){
            return getleaf(v,u);
        }
    }
    return u;
}
void DFS(int u,int p){
    if(num[u]==-1){
        assert(p!=-1);
        for(int v:comp[p]){
            in[v]=true;
        }
        int w=getleaf(p,-1);
        num[u]=num[w];
        comp[u].push_back(u);
        for(int v:comp[p]){
            in[v]=false;
            if(v!=w){
                comp[u].push_back(v);
            }
        }
    }
    for(int v:graph[u]){
        if(v!=p){
            DFS(v,u);
        }
    }
}
void buildtree(int a[],int b[],int n,int m){
    graph.clear();
    graph.resize(n);
    comp.clear();
    comp.resize(n);
    for(int i=0;i<n;i++){
        dsu[i]=-1;
        num[i]=-1;
        in[i]=false;
    }
    for(int i=0;i<m;i++){
        if(Findset(a[i])!=Findset(b[i])){
            unite(a[i],b[i]);
            graph[a[i]].push_back(b[i]);
            graph[b[i]].push_back(a[i]);
        }
    }
    setup(0,-1);
    for(int i=0;i<comp[0].size();i++){
        num[comp[0][i]]=i;
    }
    for(int u:comp[0]){
        if(u!=0){
            for(int v:comp[0]){
                comp[u].push_back(v);
            }
        }
    }
    DFS(0,-1);
}
void Joi(int n,int m,int a[],int b[],long long x,int t){
    buildtree(a,b,n,m);
    for(int i=0;i<n;i++){
        if(x&(1LL<<(num[i]))){
            MessageBoard(i,1);
        }
        else{
            MessageBoard(i,0);
        }
    }
}
#include "Ioi.h"
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10000;
const int MAXBIT=60;
int dsu[MAXN];
vector<vector<int>> graph;
vector<vector<int>> comp;
int num[MAXN];
bool in[MAXN];
int Findset(int i){
    if(dsu[i]<0){
        return i;
    }
    int root=Findset(dsu[i]);
    dsu[i]=root;
    return root;
}
void unite(int u,int v){
    u=Findset(u),v=Findset(v);
    if(u==v){
        return;
    }
    if(dsu[u]<dsu[v]){
        swap(u,v);
    }
    dsu[v]+=dsu[u];
    dsu[u]=v;
}
void setup(int u,int p){
    comp[0].push_back(u);
    if(comp[0].size()==MAXBIT){
        return;
    }
    for(int v:graph[u]){
        if(v!=p){
            setup(v,u);
            if(comp[0].size()==MAXBIT){
                return;
            }
        }
    }
}
int getleaf(int u,int p){
    for(int v:graph[u]){
        if(v!=p&&in[v]){
            return getleaf(v,u);
        }
    }
    return u;
}
void DFS(int u,int p){
    if(num[u]==-1){
        assert(p!=-1);
        for(int v:comp[p]){
            in[v]=true;
        }
        int w=getleaf(p,-1);
        num[u]=num[w];
        comp[u].push_back(u);
        for(int v:comp[p]){
            in[v]=false;
            if(v!=w){
                comp[u].push_back(v);
            }
        }
    }
    for(int v:graph[u]){
        if(v!=p){
            DFS(v,u);
        }
    }
}
void buildtree(int a[],int b[],int n,int m){
    graph.clear();
    graph.resize(n);
    comp.clear();
    comp.resize(n);
    for(int i=0;i<n;i++){
        dsu[i]=-1;
        num[i]=-1;
        in[i]=false;
    }
    for(int i=0;i<m;i++){
        if(Findset(a[i])!=Findset(b[i])){
            unite(a[i],b[i]);
            graph[a[i]].push_back(b[i]);
            graph[b[i]].push_back(a[i]);
        }
    }
    setup(0,-1);
    for(int i=0;i<comp[0].size();i++){
        num[comp[0][i]]=i;
    }
    for(int u:comp[0]){
        if(u!=0){
            for(int v:comp[0]){
                comp[u].push_back(v);
            }
        }
    }
    DFS(0,-1);
}
long long x=0;
int val[MAXN];
void calc(int u,int p){
    if(val[u]==1){
        x^=(1LL<<num[u]);
    }
    for(int v:graph[u]){
        if(v!=p&&in[v]){
            val[v]=Move(v);
            calc(v,u);
            val[u]=Move(u);
        }
    }
}
long long Ioi(int n,int m,int a[],int b[],int u,int V,int t){
    buildtree(a,b,n,m);
    for(int v:comp[u]){
        in[v]=true;
    }
    val[u]=V;
    calc(u,-1);
    return x;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |