Cod sursa(job #2493017)

Utilizator leru007Leru Ursu leru007 Data 15 noiembrie 2019 20:12:21
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
#define ll long long

using namespace std;

ll modp=1e9+7;
ll fact(ll a){
    if(a==1) return 1;
    return a*fact(a-1);
}
long long gcd(int a,int b){
    if(a==0) return b;
    return gcd(b%a,a);
}
ll lgp(ll a,ll b){
    if(b==0) return 1;
    ll t=lgp(a,b/2);
    if(b%2==1) return (((t*t)%modp)*a)%modp;
    return (t*t)%modp;
}
long long bin(long long arr[], long long l, long long r,long long x){
    ll mid=l+(r-l)/2;
    if(arr[mid]==x) return mid;
    else if(arr[mid]>x) return bin(arr ,l,mid-1,x);
    else if(arr[mid]<x)return bin(arr,mid+1,r,x);
    else return -1;
}
long long funct(long long x){
    if(x==0) return 0;
    if(x%2==0) return funct(x/2);
    else return funct(x/2)+1;
}
int n,m,par[100005],siz[100005],i,t;
int parent(int x){
    if(x!=par[x]) par[x]=parent(par[x]);
    return par[x];
}
void unire( int x, int y){
    int x1=parent(x);
    int y1=parent(y);
    if(siz[y1]>siz[x1]) swap(x1,y1);
    par[y1]=x1;
    siz[x1]+=siz[y1];
}
int main(){
    ifstream fin;
    fin.open("disjoint.in");
    ofstream fout;
    fout.open("disjoint.out");
    fin>>n>>m;
    for(i=1;i<=n;i++){
        par[i]=i;
        siz[i]=1;
    }
    for(i=1;i<=m;i++){
        fin>>t;
        if(t==1){
            int x,y;
            fin>>x>>y;
            unire(x,y);
        }
        else if(t==2){
            int x,y;
            fin>>x>>y;
            if(parent(x)==parent(y)) fout<<"DA"<<"\n";
            else fout<<"NU\n";
        }
    }
    return 0;
}