#include <bits/stdc++.h>
using namespace std;
const int maxN=3e5+10;
int n, q, in1, in2;
char type;
int grupa[maxN];
int rep[maxN*8], akt_grupa=1, sizee[maxN*8];
bool czy_one[maxN*8];
int Find(int x)
{
x=grupa[x];
if(x!=rep[x])
rep[x]=Find(x);
return rep[x];
}
void Union(int x, int y)
{
int x_pom=Find(x);
int y_pom=Find(y);
if(x_pom==0)
{
grupa[x]=akt_grupa;
x_pom=akt_grupa;
sizee[akt_grupa]=1;
rep[akt_grupa]=akt_grupa;
akt_grupa++;
y_pom=Find(y);
}
if(y_pom==0)
{
grupa[y]=akt_grupa;
y_pom=akt_grupa;
sizee[akt_grupa]=1;
rep[akt_grupa]=akt_grupa;
akt_grupa++;
}
if(y_pom==x_pom)
{
czy_one[x_pom]=1;
return;
}
if(sizee[x_pom]<sizee[y_pom]){ swap(x_pom, y_pom); swap(x, y);}
sizee[x_pom]+=sizee[y_pom];
grupa[y]=grupa[x];
rep[y_pom]=rep[x_pom];
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
while(q--)
{
cin>>type;
if(type=='+')
{
cin>>in1>>in2;
Union(in1, in2);
}
if(type=='-')
{
cin>>in1;
grupa[in1]=0;
}
if(type=='?')
{
cin>>in1;
if(Find(in1)==0) cout<<0;
else if(czy_one[Find(in1)]) cout<<1;
else cout<<"?";
}
}
}
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 | #include <bits/stdc++.h> using namespace std; const int maxN=3e5+10; int n, q, in1, in2; char type; int grupa[maxN]; int rep[maxN*8], akt_grupa=1, sizee[maxN*8]; bool czy_one[maxN*8]; int Find(int x) { x=grupa[x]; if(x!=rep[x]) rep[x]=Find(x); return rep[x]; } void Union(int x, int y) { int x_pom=Find(x); int y_pom=Find(y); if(x_pom==0) { grupa[x]=akt_grupa; x_pom=akt_grupa; sizee[akt_grupa]=1; rep[akt_grupa]=akt_grupa; akt_grupa++; y_pom=Find(y); } if(y_pom==0) { grupa[y]=akt_grupa; y_pom=akt_grupa; sizee[akt_grupa]=1; rep[akt_grupa]=akt_grupa; akt_grupa++; } if(y_pom==x_pom) { czy_one[x_pom]=1; return; } if(sizee[x_pom]<sizee[y_pom]){ swap(x_pom, y_pom); swap(x, y);} sizee[x_pom]+=sizee[y_pom]; grupa[y]=grupa[x]; rep[y_pom]=rep[x_pom]; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>q; while(q--) { cin>>type; if(type=='+') { cin>>in1>>in2; Union(in1, in2); } if(type=='-') { cin>>in1; grupa[in1]=0; } if(type=='?') { cin>>in1; if(Find(in1)==0) cout<<0; else if(czy_one[Find(in1)]) cout<<1; else cout<<"?"; } } } |
English