Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // main.cpp
- // console_her
- //
- // Created by Святой Отец on 26.06.17.
- // Copyright © 2017 Святой Отец. All rights reserved.
- //
- #include <cstdlib>
- #include <fstream>
- #include <iostream>
- #include <string>
- using namespace std;
- ifstream fin("dsu.in");
- ofstream fout("dsu.out");
- int n;
- struct set{
- int max;
- int min;
- int size;
- bool is_actual=true;
- int actual;
- };
- int prin[100];
- set* unions[100];
- void combine(int num1, int num2){
- if(num1>num2)
- swap(num1,num2);
- if(unions[num2]->is_actual && unions[num1]->is_actual){
- if(num1==num2)return;
- unions[num1]->max = unions[num2]->max;
- unions[num1]->size += unions[num2]->size;
- unions[num2]->is_actual=false;
- unions[num2]->actual=num1;
- return;
- }
- else if(unions[num1]->is_actual && !(unions[num2]->is_actual))
- combine(num1, unions[num2]->actual);
- else if(!(unions[num1]->is_actual) && unions[num2]->is_actual)
- combine(unions[num1]->actual,num2);
- else
- combine(unions[num1]->actual,unions[num2]->actual);
- }
- void get(int num1){
- if(unions[num1]->is_actual)
- cout<<unions[num1]->min<<" "<<unions[num1]->max<<" "<<unions[num1]->size<<endl;
- else
- get(unions[num1]->actual);
- }
- int main(){
- int num1, num2;
- cin>>n;
- string command;
- for(int i=0; i<n; i++){
- unions[i]=new set;
- unions[i]->min=i+1;
- unions[i]->max=i+1;
- unions[i]->size=1;
- }
- while(cin>>command){
- switch(command[0]){
- case 'u':{
- cin>>num1>>num2;
- combine(num1-1, num2-1);
- }break;
- case 'g':{
- cin>>num1;
- get(num1-1);
- }break;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment