Pagini recente » Cod sursa (job #2061371) | Cod sursa (job #2335847) | Cod sursa (job #3238502) | Cod sursa (job #1190537) | Cod sursa (job #633250)
Cod sursa(job #633250)
#include<cstdio>
#include<vector>
#include<algorithm>
#define nMax 100001
#define Check() if (++pozitie == nMax){fread (buff, 1, nMax, stdin); pozitie = 0;}
using namespace std;
int n, m;
vector <int>L[nMax];
int multime[nMax]; // multime[i] = indicele multimii in care se afla elementul i
char buff[nMax];
int pozitie;
void Citeste(int &x) {
x = 0;
while(buff[pozitie] < '0' || buff[pozitie] > '9') Check();
while('0' <= buff[pozitie] && buff[pozitie] <= '9') {
x = x * 10 + (buff[pozitie] - '0');
Check();
}
}
void Reuneste(const int &x, const int &y) {
int k;
int i = multime[x]; // indicele multimii lui x
int j = multime[y]; // indicele multimii lui y
if(L[i].size() < L[j].size()) swap(i, j); // selectez lista cea mai scurta
for(k = 0; k < (int)L[j].size(); k++) {
L[i].push_back(L[j][k]);
multime[L[j][k]] = i;
}
}
void Afiseaza(const int &x, const int &y) {
if(multime[x] == multime[y]) printf("DA\n");
else printf("NU\n");
}
int main() {
int i, x, y, cod;
freopen("disjoint.in", "r", stdin), freopen("disjoint.out", "w", stdout);
Citeste(n); Citeste(m);
for(i = 1; i <= n; i++) {
L[i].push_back(i);
multime[i] = i;
}
for(i = 1; i <= m; i++) {
Citeste(cod); Citeste(x); Citeste(y);
if(cod == 1) Reuneste(x, y);
else Afiseaza(x, y);
}
return 0;
}