Raslboyy

Untitled

Jan 15th, 2020
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.11 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <string>
  5. #include <math.h>
  6. #include <climits>
  7.  
  8. //#pragma GCC optimize("O3, unroll-loops");
  9.  
  10. #include <list>
  11. #include <map>
  12. #include <set>
  13. #include <queue>
  14. #include <unordered_map>
  15. #include <unordered_set>
  16. #include <stdexcept>
  17. //#include <chrono>
  18. //#include <fstream>
  19. //#include <bits/stdc++.h>
  20.  
  21. #define mp make_pair
  22. #define pb push_back
  23. #define eb emplace_back
  24. #define x first
  25. #define y second
  26. #define sz(x) (int)x.size()
  27. #define all(x) begin(x), end(x)
  28. #define rall(x) rbegin(x), rend(x)
  29. #define FOR(i,a,b) for (int i = (a); i < (b); i++)
  30. #define RFOR(i,b,a) for (int i = (b) - 1; i >= (a); i--)
  31.  
  32. using namespace std;
  33.  
  34. typedef unsigned long long ull;
  35. typedef long long ll;
  36. typedef long double ld;
  37. typedef pair<int, int> pi;
  38. typedef pair<ll, ll> pl;
  39. typedef vector<int> veci;
  40. typedef vector<bool> vecb;
  41. typedef vector<vector<int>> vvi;
  42. typedef vector<vector<bool>> vvb;
  43.  
  44. const int INF_I = 1e9;
  45. const ll INF_LL = 1e18;
  46.  
  47. class DSU {
  48. public:
  49.     DSU(int n) {
  50.         par.assign(n, 0);
  51.         size.assign(n, 1);
  52.         FOR(i, 0, n)
  53.             par[i] = i;
  54.     }
  55.     int find_set(int v);
  56.     void union_sets(int a, int b);
  57. private:
  58.     int n;
  59.     veci par;
  60.     veci size;
  61. };
  62.  
  63.  
  64.  
  65. class node {
  66. public:
  67.     node() : left(nullptr), right(nullptr), val(0) {};
  68.     ull val;
  69.     node* left;
  70.     node* right;
  71. };
  72.  
  73.  
  74.  
  75. class tree {
  76. public:
  77.     tree(int n) : n(n) {
  78.         vec.assign(n, new node());
  79.         last = new node();
  80.         build(last, 0, n - 1);
  81.         cnt++;
  82.     }
  83.    
  84.     void update(list<int>& l) {
  85.         for (int i : l) {
  86.             auto last_ = last;
  87.             last = new node();
  88.             upgrade(last_, last, 0, n - 1, i, 1);
  89.         }
  90.         vec[cnt] = last;
  91.         cnt++;
  92.     }
  93.  
  94.     int get(int l, int r) {
  95.         /*int sum_r = 0;
  96.         for (auto i : vec[r])
  97.             query(i, 0, n - 1, l - 1, r - 1);
  98.         int sum_l = 0;
  99.         for (auto i : vec[l-1])
  100.             query(i, 0, n - 1, l - 1, r - 1);*/
  101.         return query(vec[r], 0, n - 1, l - 1, r - 1) - query(vec[l-1], 0, n - 1, l - 1, r - 1);
  102.     }
  103.  
  104.     int get(node* v, int l, int r) {
  105.         return query(v, 0, n - 1, l, r);
  106.     }
  107.  
  108.     node* last;
  109.     vector<node*> vec;
  110.     int n;
  111. private:
  112.     int cnt = 0;
  113.     void build(node* n, int low, int high)
  114.     {
  115.         if (low == high)
  116.         {
  117.             n->val = 0;
  118.             return;
  119.         }
  120.         int mid = (low + high) >> 1;
  121.         n->left = new node();
  122.         n->right = new node();
  123.         build(n->left, low, mid);
  124.         build(n->right, mid + 1, high);
  125.         n->val = n->left->val + n->right->val;
  126.     }
  127.  
  128.     void upgrade(node* prev, node* cur, int low, int high, int idx, int value)
  129.     {
  130.         if (idx > high || idx < low || low > high)
  131.             return;
  132.         if (low == high)
  133.         {
  134.             cur->val+=value + (prev == nullptr ? 0 : prev->val);
  135.             return;
  136.         }
  137.         int mid = (low + high) >> 1;
  138.         if (idx <= mid)
  139.         {
  140.             cur->right = prev->right;
  141.             cur->left = new node();
  142.             upgrade(prev->left, cur->left, low, mid, idx, value);
  143.         }
  144.         else
  145.         {
  146.             cur->left = prev->left;
  147.             cur->right = new node();
  148.             upgrade(prev->right, cur->right, mid + 1, high, idx, value);
  149.         }
  150.         cur->val = (cur->left == nullptr ? 0 : cur->left->val) + (cur->right == nullptr ? 0 : cur->right->val);
  151.     }
  152.  
  153.     void upgrade(node* cur, int low, int high, int idx) {
  154.         if (idx > high || idx < low || low > high || cur == nullptr)
  155.             return;
  156.         if (low == high){
  157.             cur->val++;
  158.             return;
  159.         }
  160.         int mid = (low + high) >> 1;
  161.         if (idx <= mid)
  162.             upgrade(cur->left, low, mid, idx);
  163.         else
  164.             upgrade(cur->right, mid + 1, high, idx);
  165.         cur->val = (cur->left == nullptr ? 0 : cur->left->val) + (cur->right == nullptr ? 0 : cur->right->val);
  166.     }
  167.     int query(node* n, int low, int high, int l, int r)
  168.     {
  169.         if (l > high || r < low || low > high || n == nullptr)
  170.             return 0;
  171.         if (l <= low && high <= r)
  172.             return n->val;
  173.         int mid = (low + high) / 2;
  174.         return query(n->left, low, mid, l, r)
  175.             +
  176.             query(n->right, mid + 1, high, l, r);
  177.     }
  178. };
  179.  
  180. int main() {
  181.     /*ifstream cin("in.txt");
  182.     ofstream cout("out.txt");
  183.     auto start_time = chrono::high_resolution_clock::now();*/
  184.  
  185.     ios::sync_with_stdio(false);
  186.     cin.tie(0);
  187.     cout.tie(0);
  188.  
  189.     /*veci t(10, 0);
  190.     CPersistentSegmentTree<int, std::plus<int>> tree(t.begin(), t.end(), 0);
  191.     vector<pi> v = { mp(0, 4), mp(1, 5) };*/
  192.  
  193.     int n = 1e5;
  194.     int k = 1;
  195.  
  196.     /*int n, q, k;
  197.     cin >> n >> q >> k;*/
  198.     int q = 6;
  199.  
  200.  
  201.     vector<pi> a(n);
  202.     /*a[0].x = 1;
  203.     a[0].y = 0;
  204.     a[n - 1].x = 2;
  205.     a[n - 1].y = n-1;*/
  206.  // for (int i = 1, j = n - 2; i < n/2; i++, j--) {
  207.     //  /*cin >> a[i].x;*/
  208.     //  a[i].x = a[i-1].x + 2;
  209.     //  a[j].x = a[j + 1].x + 2;
  210.     //  a[i].y = i;
  211.     //  a[j].y = j;
  212.     //}
  213.     for (int i = 0; i < n; i++) {
  214.         /*cin >> a[i].x;*/
  215.         a[i].x = i;
  216.         a[i].y = i;
  217.     }
  218.  
  219.    
  220.     sort(all(a), [](pi a1, pi a2) {
  221.         return a1.x < a2.x;
  222.     });
  223.  
  224.     vector<pi> b(n);
  225.     set<int> out_of;
  226.     int win_l = lower_bound(all(a), mp(a[0].x - k, 0), [](pi a, pi b) {
  227.         return a.x < b.x;
  228.     }) - a.begin();
  229.     int win_r = win_l;
  230.     DSU dsu(n);
  231.     set<int> s;
  232.     for (int i = 0; i < n; i++) {
  233.         int j_l = lower_bound(all(a), mp(a[i].x - k, 0), [](pi a, pi b) {
  234.             return a.x < b.x;
  235.         }) - a.begin();
  236.         int j_r = upper_bound(all(a), mp(a[i].x + k, 0), [](pi a, pi b) {
  237.             return a.x < b.x;
  238.         }) - a.begin() - 1;
  239.         if (i > 0) s.emplace(a[i - 1].y);
  240.         while (win_l < j_l) {
  241.             s.erase(a[win_l].y);
  242.             win_l++;
  243.         }
  244.         while (win_r <= j_r) {
  245.             s.emplace(a[win_r].y);
  246.             win_r++;
  247.         }
  248.         if (s.size() == 0)
  249.             continue;
  250.         auto it = s.lower_bound(a[i].y);
  251.         if (it == s.begin()) {
  252.             b[i] = mp(-1, a[i].y);
  253.             out_of.emplace(i);
  254.         }
  255.         else {
  256.             it--;
  257.             dsu.union_sets(*it, a[i].y);
  258.             b[i] = mp(*it, a[i].y);
  259.         }
  260.     }
  261.     win_l = win_r = lower_bound(all(a), mp(a[*out_of.begin()].x - k, 0), [](pi a, pi b) {
  262.         return a.x < b.x;
  263.     }) - a.begin();
  264.     s.clear();
  265.    
  266.  
  267.     for (int i : out_of) {
  268.         int j_l = lower_bound(all(a), mp(a[i].x - k, 0), [](pi a, pi b) {
  269.             return a.x < b.x;
  270.         }) - a.begin();
  271.         int j_r = upper_bound(all(a), mp(a[i].x + k, 0), [](pi a, pi b) {
  272.             return a.x < b.x;
  273.         }) - a.begin() - 1;
  274.         if (i > 0) s.emplace(a[i - 1].y);
  275.         while (win_l < j_l) {
  276.             s.erase(a[win_l].y);
  277.             win_l++;
  278.         }
  279.         while (win_r <= j_r) {
  280.             s.emplace(a[win_r].y);
  281.             win_r++;
  282.         }
  283.         if (s.size() == 0)
  284.             continue;
  285.         auto it = s.upper_bound(a[i].y);
  286.  
  287.         for ( ; it != s.end(); it++)
  288.             if (dsu.find_set(*it) != dsu.find_set(a[i].y)) {
  289.                 b[i] = mp(a[i].y, *it);
  290.                 break;
  291.             }
  292.     }
  293.  
  294.     sort(all(b), [](pi b1, pi b2) {
  295.         return b1.y < b2.y;
  296.     });
  297.  
  298.  
  299.     tree t(n + 1);
  300.     win_r = upper_bound(all(b), mp(-1, INT_MAX), [](pi a, pi b) {
  301.         return a.x < b.x;
  302.     }) - b.begin();
  303.  
  304.     for (int i = 0; i < n && win_r < n; i++) {
  305.         list<int> l;
  306.         while (win_r < n && i == b[win_r].y) {
  307.             l.eb(b[win_r].x);
  308.             win_r++;
  309.         }
  310.         t.update(l);
  311.     }
  312.  
  313.     while (q--) {
  314.         int l, r;
  315.         cin >> l >> r;
  316.         cout << r - l + 1 - t.get(l, r) << '\n';
  317.     }
  318.  
  319.     /*auto end_time = chrono::high_resolution_clock::now();
  320.     chrono::duration<double> duration = end_time - start_time;
  321.     cout << duration.count() << "\n";
  322.     cin.close();
  323.     cout.close();*/
  324.     return 0;
  325. }
  326.  
  327. int DSU::find_set(int v)
  328. {
  329.     return (par[v] == v ? v : par[v] = find_set(par[v]));
  330. }
  331.  
  332. void DSU::union_sets(int a, int b)
  333. {
  334.     a = find_set(a);
  335.     b = find_set(b);
  336.     if (a != b) {
  337.         if (size[b] > size[a])
  338.             swap(a, b);
  339.         size[a] += size[b];
  340.         par[b] = a;
  341.     }
  342. }
Advertisement
Add Comment
Please, Sign In to add comment