Pagini recente » Cod sursa (job #3229488) | Cod sursa (job #2001833) | Cod sursa (job #2188692) | Cod sursa (job #745442) | Cod sursa (job #329974)
Cod sursa(job #329974)
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
FILE*fin=fopen("disjoint.in","r");
FILE*fout=fopen("disjoint.out","w");
#define nm 100005
#define maxbuf 65536
int n,m,tata[nm],grad[nm],ind;
char buf[maxbuf];
inline void refbuf()
{
int ans = fread(buf,1,maxbuf,fin);
if (ans < maxbuf) buf[ans]=0;
ind = 0;
}
inline int getnr()
{
int ans=0;
one:
while(ind<maxbuf&&!isdigit(buf[ind])) ind++;
if(ind==maxbuf)
{
refbuf();
goto one;
}
two:
while(ind<maxbuf&&isdigit(buf[ind]))
{
ans=ans*10+buf[ind]-'0';
ind++;
}
if(ind==maxbuf)
{
refbuf();
goto two;
}
return ans;
}
inline int find(int x)
{
int nod=x,wt;
while(tata[nod]!=nod) nod=tata[nod];
while(x!=nod)
{
wt=tata[x];
tata[x]=nod;
x=wt;
}
return nod;
}
void unite(int x,int y)
{
if(grad[x]>grad[y]) tata[y]=x;
else tata[x]=y;
if(grad[x]==grad[y]) grad[y]++;
}
int main()
{
int i,a,b,op;
refbuf();
n=getnr();
m=getnr();
for(i=1;i<=n;i++)
{
tata[i]=i;
grad[i]=1;
}
for(i=1;i<=m;i++)
{
op=getnr();
a=getnr();
b=getnr();
int x,y;
x=find(a);
y=find(b);
if(op==1) unite(x,y);
else if(x==y) fprintf(fout,"DA\n");
else fprintf(fout,"NU\n");
}
fclose(fin);
fclose(fout);
return 0;
}