Pagini recente » Cod sursa (job #1873463) | smunteanu_oji_2022_cl10 | Cod sursa (job #2043964) | Cod sursa (job #207921) | Cod sursa (job #384640)
Cod sursa(job #384640)
// Catalin Balan
// Wed Jan 20 16:36:42 EET 2010
// Infoarena - disjoint
#include <cstdio>
#include <cstdlib>
using namespace std;
#define NMAX 100003
#define CHUNK 8192
#define max(a,b) (a>b?a:b)
#define FIN "disjoint.in"
#define FOUT "disjoint.out"
char g_buf[CHUNK];
int g_p=CHUNK-1;
inline int get(FILE *f)
{
int x = 0;
while (g_buf[g_p] < '0' || g_buf[g_p] > '9')
if (++g_p == CHUNK) fread(g_buf,1,CHUNK,f), g_p=0;
while (g_buf[g_p] >= '0' && g_buf[g_p] <= '9')
{
x = x*10 + g_buf[g_p]-'0';
if (++g_p == CHUNK) fread(g_buf,1,CHUNK,f), g_p=0;
}
return x;
}
int parent[NMAX];
int height[NMAX];
int getRoot(int k)
{
while (parent[k]!=k) k = parent[k];
return k;
}
void merge(int x, int y)
{
int px,py;
px = getRoot(x);
py = getRoot(y);
int q,r;
if (height[px] > height[py])
{
height[px] = max(height[px], height[py]+1);
for (q = y; q != py;)
{
r = parent[q];
parent[q] = px;
q = r;
}
parent[py] = px;
} else {
height[py] = max(height[py], height[px]+1);
for (q = x; q != px;)
{
r = parent[q];
parent[q] = py;
q = r;
}
parent[px] = py;
}
}
bool querry(int x, int y)
{
if (getRoot(x) == getRoot(y))
return true;
return false;
}
int main(int argv, char ** argc)
{
FILE *f = fopen(FIN, "r");
FILE *g = fopen(FOUT, "w");
int n,m,x,y,type;
n = get(f);
m = get(f);
for (int i = 1; i <= n; ++i) parent[i] = i;
for (int run = 1; run <= m; ++run)
{
type = get(f);
x = get(f);
y = get(f);
if (type == 1) merge(x,y);
else
{
if (querry(x,y)) fprintf(g,"DA\n");
else fprintf(g,"NU\n");
}
}
fclose(f);
fclose(g);
return EXIT_SUCCESS;
}