Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- vector<int> weight;
- struct SNM {
- vector<int> parent;
- //vector<vector<int>> v_cats;
- int get_parent(int vertex) {
- if (parent[vertex] == vertex)
- return vertex;
- return parent[vertex] = get_parent(parent[vertex]);
- }
- void join_sets(int m1, int m2) {
- m1 = get_parent(m1);
- m2 = get_parent(m2);
- if (m1 != m2) {
- if (weight[m1] < weight[m2]){
- int temporary = m1;
- m1 = m2;
- m2 = temporary;
- }
- //v_cats[m1].insert(v_cats[m1].end(), v_cats[m2].begin(), v_cats[m2].end());
- parent[m2] = m1;
- //v_cats[m2].clear();
- weight[m1] += weight[m2];
- }
- }
- void create_set(int n) {
- parent = vector<int>(n);
- //v_cats = vector<vector<int>> (n);
- weight = vector<int>(n, 1);
- for (int i = 0; i < n; i++) {
- //v_cats[i].push_back(i);
- parent[i] = i;
- }
- }
- };
- int main() {
- int n, m, k, a, b;
- cin >> n >> m >> k;
- SNM snm;
- snm.create_set(n);
- vector<vector<int>> g(n);
- vector<vector<int>> command(k, vector<int> (3));
- for (int i = 0; i < m; i++){
- cin >> a >> b;
- g[a - 1].push_back(b - 1);
- }
- for (int i = 0; i < k; i++){
- string inp;
- cin >> inp >> a >> b;
- if (inp == "ask"){
- command[k - 1 - i][0] = 1;
- command[k - 1 - i][1] = a - 1;
- command[k - 1 - i][2] = b - 1;
- } else {
- command[k - 1 - i][0] = 2;
- command[k - 1 - i][1] = a - 1;
- command[k - 1 - i][2] = b - 1;
- }
- }
- vector<int> answer;
- for (int i = 0; i < k; i++){
- if (command[i][0] == 1){
- if (snm.get_parent(command[i][1]) == snm.get_parent(command[i][2]))
- answer.push_back(1);
- else{
- answer.push_back(0);
- }
- } else {
- snm.join_sets(command[i][1], command[i][2]);
- }
- }
- for (int i = 0; i < answer.size(); i++){
- if(answer[answer.size() - 1 - i] == 1)
- cout << "YES" << endl;
- else
- cout << "NO" << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement