#include<bits/stdc++.h>
using namespace std;
int legenda[300010];
struct node{
bool czy;
vector<int>graf;
int father;
int r = 1;
bool usu;
int nr;
};
node tab[1000010+300010];
int it;
void dfs(int x, int o){
tab[x].czy = 1;
for(auto j: tab[x].graf)
if(j!=o)
dfs(j, x);
tab[x].graf.clear();
}
int find(int x){
if(tab[x].father==x)return x;
return tab[x].father = find(tab[x].father);
}
int znajdz;
void dfs2(int x, int o){
if(tab[x].usu==0)znajdz = tab[x].nr;
for(auto j: tab[x].graf)
if(j!=o)
dfs2(j,x);
tab[x].graf.clear();
}
int main()
{
int n, i, q;
scanf("%d%d", &n, &q);
for(i=1;i<=n;i++){
legenda[i] = it++;
}
for(i=0;i<n;i++){
tab[i].father = i;
tab[i].nr = i+1;
}
while(q--){
char znak;
scanf(" %c", &znak);
if(znak=='?'){
int a;
scanf("%d", &a);
if(tab[legenda[a]].czy==1)printf("1");
else if(tab[legenda[a]].graf.size()>0)printf("?");
else printf("0");
}
else if(znak=='-'){
int a;
scanf("%d", &a);
int b = legenda[a];
tab[b].usu = 1;
legenda[a] = it++;
tab[legenda[a]].father = legenda[a];
tab[legenda[a]].nr = a;
// printf("%d\n", tab[find(b)].r);
if(--tab[find(b)].r==1){
znajdz = -1;
dfs2(b,-1);
// printf("znajdz: %d ", znajdz);
legenda[znajdz] = it++;
tab[legenda[znajdz]].father = legenda[znajdz];
tab[legenda[znajdz]].nr = znajdz;
}
}
else if(znak=='+'){
int a, b;
scanf("%d%d", &a, &b);
if(tab[legenda[a]].czy){
// printf("a ustalony\n");
dfs(legenda[b], -1);
continue;
}
if(tab[legenda[b]].czy){
// printf("b ustalony\n");
dfs(legenda[a],-1);
continue;
}
if(find(legenda[a])==find(legenda[b])){
// printf("jedno drzewo %d %d\n", a, b);
dfs(legenda[a], -1);
continue;
}
tab[find(legenda[b])].r+=tab[find(legenda[a])].r;
tab[find(legenda[a])].father = find(legenda[b]);
tab[legenda[a]].graf.push_back(legenda[b]);
tab[legenda[b]].graf.push_back(legenda[a]);
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | #include<bits/stdc++.h> using namespace std; int legenda[300010]; struct node{ bool czy; vector<int>graf; int father; int r = 1; bool usu; int nr; }; node tab[1000010+300010]; int it; void dfs(int x, int o){ tab[x].czy = 1; for(auto j: tab[x].graf) if(j!=o) dfs(j, x); tab[x].graf.clear(); } int find(int x){ if(tab[x].father==x)return x; return tab[x].father = find(tab[x].father); } int znajdz; void dfs2(int x, int o){ if(tab[x].usu==0)znajdz = tab[x].nr; for(auto j: tab[x].graf) if(j!=o) dfs2(j,x); tab[x].graf.clear(); } int main() { int n, i, q; scanf("%d%d", &n, &q); for(i=1;i<=n;i++){ legenda[i] = it++; } for(i=0;i<n;i++){ tab[i].father = i; tab[i].nr = i+1; } while(q--){ char znak; scanf(" %c", &znak); if(znak=='?'){ int a; scanf("%d", &a); if(tab[legenda[a]].czy==1)printf("1"); else if(tab[legenda[a]].graf.size()>0)printf("?"); else printf("0"); } else if(znak=='-'){ int a; scanf("%d", &a); int b = legenda[a]; tab[b].usu = 1; legenda[a] = it++; tab[legenda[a]].father = legenda[a]; tab[legenda[a]].nr = a; // printf("%d\n", tab[find(b)].r); if(--tab[find(b)].r==1){ znajdz = -1; dfs2(b,-1); // printf("znajdz: %d ", znajdz); legenda[znajdz] = it++; tab[legenda[znajdz]].father = legenda[znajdz]; tab[legenda[znajdz]].nr = znajdz; } } else if(znak=='+'){ int a, b; scanf("%d%d", &a, &b); if(tab[legenda[a]].czy){ // printf("a ustalony\n"); dfs(legenda[b], -1); continue; } if(tab[legenda[b]].czy){ // printf("b ustalony\n"); dfs(legenda[a],-1); continue; } if(find(legenda[a])==find(legenda[b])){ // printf("jedno drzewo %d %d\n", a, b); dfs(legenda[a], -1); continue; } tab[find(legenda[b])].r+=tab[find(legenda[a])].r; tab[find(legenda[a])].father = find(legenda[b]); tab[legenda[a]].graf.push_back(legenda[b]); tab[legenda[b]].graf.push_back(legenda[a]); } } } |
English