/* 2024
* Maciej Szeptuch
*/
#include <algorithm>
#include <cstdio>
const int MAX_CITIZENS = 300001;
const int MAX_GROUPS = MAX_CITIZENS + 1000001;
char query[2];
int computers[MAX_GROUPS];
int group[MAX_GROUPS];
int groups;
int queries;
int size[MAX_GROUPS];
void join(int a, int b);
void remove(int a);
int find(int a);
int main(void)
{
scanf("%d %d", &groups, &queries);
for(int g = 0; g < groups; ++g)
{
group[g] = MAX_CITIZENS + g;
group[group[g]] = group[g];
size[group[g]] = 1;
}
for(int q = 0; q < queries; ++q)
{
int a = 0;
int b = 0;
scanf("%s %d", query, &a);
--a;
switch(query[0])
{
case '+':
scanf("%d", &b);
--b;
join(a, b);
break;
case '-':
remove(a);
break;
case '?':
b = find(a);
if(size[b] == 1)
putchar(computers[b] ? '1' : '0');
else if(size[b] == computers[b])
putchar('1');
else
putchar('?');
break;
}
}
puts("");
return 0;
}
void join(int a, int b)
{
a = find(a);
b = find(b);
if(a == b)
{
++computers[a];
return;
}
if(size[a] > size[b])
std::swap(a, b);
size[b] += size[a];
computers[b] += computers[a] + 1;
group[a] = b;
}
inline void remove(int a)
{
int _a = find(a);
--size[_a];
--computers[_a];
group[a] = MAX_CITIZENS + groups++;
group[group[a]] = group[a];
size[group[a]] = 1;
}
inline int find(int a)
{
if(group[a] == a)
return a;
return group[a] = find(group[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 99 100 | /* 2024 * Maciej Szeptuch */ #include <algorithm> #include <cstdio> const int MAX_CITIZENS = 300001; const int MAX_GROUPS = MAX_CITIZENS + 1000001; char query[2]; int computers[MAX_GROUPS]; int group[MAX_GROUPS]; int groups; int queries; int size[MAX_GROUPS]; void join(int a, int b); void remove(int a); int find(int a); int main(void) { scanf("%d %d", &groups, &queries); for(int g = 0; g < groups; ++g) { group[g] = MAX_CITIZENS + g; group[group[g]] = group[g]; size[group[g]] = 1; } for(int q = 0; q < queries; ++q) { int a = 0; int b = 0; scanf("%s %d", query, &a); --a; switch(query[0]) { case '+': scanf("%d", &b); --b; join(a, b); break; case '-': remove(a); break; case '?': b = find(a); if(size[b] == 1) putchar(computers[b] ? '1' : '0'); else if(size[b] == computers[b]) putchar('1'); else putchar('?'); break; } } puts(""); return 0; } void join(int a, int b) { a = find(a); b = find(b); if(a == b) { ++computers[a]; return; } if(size[a] > size[b]) std::swap(a, b); size[b] += size[a]; computers[b] += computers[a] + 1; group[a] = b; } inline void remove(int a) { int _a = find(a); --size[_a]; --computers[_a]; group[a] = MAX_CITIZENS + groups++; group[group[a]] = group[a]; size[group[a]] = 1; } inline int find(int a) { if(group[a] == a) return a; return group[a] = find(group[a]); } |
English