Cod sursa(job #1696487)

Utilizator DjokValeriu Motroi Djok Data 29 aprilie 2016 11:35:34
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<bits/stdc++.h>
using namespace std;

int i,n,q,sum[100005],op,x,y,poz[100005];
map<int,bool> M[100005];

int main()
{
  ifstream cin("disjoint.in");
  ofstream cout("disjoint.out");

  ios_base::sync_with_stdio(0); cin.tie(0);

  cin>>n>>q;

  for(i=1;i<=n;++i) M[i][i]=1,sum[i]=i,poz[i]=i;

  while(q--)
  {
    cin>>op;

    if(op==1)
    {
      cin>>x>>y;

      if(poz[x]==poz[y]) continue;

      if(M[poz[x]].size()>M[poz[y]].size()) swap(x,y);

      op=x;

      for(auto it:M[poz[x]])
      {
        M[poz[y]][it.first]=1;
        poz[it.first]=poz[y];
        sum[poz[y]]+=it.first;
      }

      M[op].clear();

      continue;
    }

    if(op==2)
    {
      cin>>x>>y;

      if(poz[x]==poz[y]) cout<<"DA\n";
      else cout<<"NU\n";

      M[poz[y]][x]=1; sum[poz[y]]+=x;
      M[poz[x]].erase(x); sum[poz[x]]-=x;
      poz[x]=poz[y];

      continue;
    }

    if(op==3)
    {
      cin>>x;
      cout<<M[poz[x]].size()<<' '<<sum[poz[x]]<<'\n';
    }
  }

 return 0;
}