Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <string>
- #include <set>
- //#include <unordered_set>
- #include <fstream>
- #include <map>
- //#include <unordered_map>
- #include <random>
- #include <stack>
- //#include <stdio.h>
- #include <algorithm>
- #include <cmath>
- //#include <ctime>
- using namespace std;
- #define ll long long
- #define MOD 1000000007
- #define mp(a, b) make_pair(a, b)
- #define PI 3.1415926535
- #define EPS 0.00000001
- #define pii pair<int, int>
- #define INF 1000000000ll*1000000000ll
- #define DEBUG 41
- #ifndef DEBUG
- ifstream in("input.in");
- ofstream out("output.out");
- #define cin in
- #define cout out
- #endif
- int parent[654321];
- int rak[654321];
- void make_set (int v)
- {
- parent[v] = v;
- rak[v] = 0;
- }
- int find_set (int v) {
- if (v == parent[v])
- return v;
- return parent[v] = find_set (parent[v]);
- }
- void union_sets (int a, int b) {
- a = find_set (a);
- b = find_set (b);
- if (a != b) {
- if (rak[a] < rak[b])
- swap (a, b);
- parent[b] = a;
- if (rak[a] == rak[b])
- ++rak[a];
- }
- }
- map<int, int> mapka;
- int main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- int n, q;
- cin >> n >> q;
- for(int i = 1; i <= n; ++i)
- parent[i] = i;
- for(int i = 0; i < q; ++i)
- {
- int type;
- cin >> type;
- int l, r;
- cin >> l >> r;
- if(type == 3)
- {
- if(find_set(l) == find_set(r))
- cout << "YES\n";
- else
- cout << "NO\n";
- }
- else if(type == 1)
- union_sets(l, r);
- else
- {
- if(l > r)
- swap(l, r);
- if(l == r)
- continue;
- if(mapka.size() == 0)
- {
- for(int i = l+1; i <= r; ++i)
- union_sets(l, i);
- mapka[l] = r;
- }
- else
- {
- map<int, int>::iterator it = mapka.lower_bound(l);
- if(it != mapka.end() && it != mapka.begin())
- {
- --it;
- int cur = l+1;
- int curL = cur;
- int curR = r;
- if(cur <= it->second)
- {
- cur = it->second;
- union_sets(l, l+1);
- curL = min(cur, it->first);
- mapka.erase(it);
- }
- for(cur; cur <= r; ++cur)
- {
- it = mapka.find(cur);
- if(it != mapka.end())
- {
- cur = it->second;
- curR = max(curR, it->second);
- mapka.erase(it);
- }
- union_sets(l, cur);
- }
- mapka[curL] = curR;
- }
- else
- {
- for(int i = l+1; i <= r; ++i)
- union_sets(l, i);
- mapka[l] = r;
- }
- }
- }
- }
- }
- /*
- n-1 m
- m-1 n
- n^2 - 2n + 1 + m^2
- n^2 - 2m + 1 + m^2
- n <= m
- 100 4
- 2 10 20
- 2 30 40
- 2 20 30
- 3 10 40
- NO
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement