Advertisement
ivnikkk

Untitled

Dec 23rd, 2022
986
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.26 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "bits/stdc++.h"
  3. using namespace std;
  4. //#define int long long
  5. #define all(a) a.begin(), a.end()
  6. const int inf = 1;
  7. struct Segtree {
  8.     struct Node {
  9.         int mx, val;
  10.         Node() { mx = -inf, val = -inf;}
  11.         Node(int _m, int _v) : mx(_m), val(_v) {}
  12.     };
  13.     int n;
  14.     vector<Node> t;
  15.     Segtree() {}
  16.     void init(int _n) {
  17.         n = _n;
  18.         t.resize(4 * n, Node());
  19.     }
  20.     void update(int v, int tl, int tr, int l, int r, int now) {
  21.         if (tl > r || tr < l) {
  22.             return;
  23.         }
  24.         if (tl >= l && tr <= r) {
  25.             t[v].mx = now, t[v].val = now;
  26.             return;
  27.         }
  28.         int tm = (tl + tr) / 2;
  29.         update(v * 2, tl, tm, l, r , now);
  30.         update(v * 2 + 1, tm + 1, tr, l, r, now);
  31.         t[v].mx = max(t[v * 2].mx, t[v * 2 + 1].mx);
  32.         return;
  33.     }
  34.     void update(int l, int r, int now) {
  35.         update(1, 0, n - 1, l, r, now);
  36.     }
  37.     int get_mx(int v, int tl, int tr, int l, int r) {
  38.         if (tr < l || tl>r) return -inf;
  39.         if (tl >= l && tr <= r) return t[v].mx;
  40.         int tm = (tl + tr) / 2;
  41.         return max({t[v].val, get_mx(v * 2, tl, tm, l, r), get_mx(v * 2 + 1, tm + 1, tr, l, r)});
  42.     }
  43.     int get_max(int l, int r) {
  44.         return get_mx(1, 0, n - 1, l, r);
  45.     }
  46. };
  47. vector<pair<int, int>> seg;
  48. vector<int> jump_l, jump_r;
  49. vector<int> ans;
  50. vector<pair<int, int>> query;
  51. vector<vector<int>> ind_query;
  52. vector<int> pref, suf;
  53. vector<unordered_set<int>> mrg;
  54. int it_v = -1;
  55. void devide(int l, int r) {
  56.     it_v++;
  57.     if (l == r) {
  58.         for (int& ind_q : ind_query[l]) {
  59.             mrg[it_v].insert(ind_q);
  60.         }
  61.         return;
  62.     }
  63.     int m = (l + r) / 2;
  64.     int v_l = it_v + 1;
  65.     devide(l, m);
  66.     int v_r = it_v + 1;
  67.     devide(m + 1, r);
  68.    
  69.     mrg[it_v].swap(mrg[v_l]);
  70.     vector<int> lca_query;
  71.     for (auto& it : mrg[v_r]) {
  72.         if (mrg[it_v].count(it)) {
  73.             lca_query.push_back(it);
  74.         }
  75.     }
  76.     /*for (int i = x; i <= y; i++) {
  77.             if (jump_l[i] >= lst) {
  78.                 res++;
  79.                 lst = i;
  80.             }
  81.         }*/
  82.     for (auto& it : mrg[v_r]) { mrg[it_v].insert(it); }
  83.     int lst = m + 1;
  84.     for (int i = m + 1; i <= r; i++) {
  85.         pref[i] = 0;
  86.         if (jump_l[i] >= lst) {
  87.             pref[i]++;
  88.             lst = i;
  89.         }
  90.         if (i > m + 1) {
  91.             pref[i] += pref[i - 1];
  92.         }
  93.     }
  94.     lst = m;
  95.     for (int i = m; i >= l; i--) {
  96.         suf[i] = 0;
  97.         if (jump_r[i] <= lst) {
  98.             suf[i]++;
  99.             lst = i;
  100.         }
  101.         if (i < m) {
  102.             suf[i] += suf[i - 1];
  103.         }
  104.     }
  105.  
  106. }
  107. signed main() {
  108. #ifdef _DEBUG
  109.     freopen("input.txt", "r", stdin);
  110.     freopen("output.txt", "w", stdout);
  111. #endif
  112.     ios_base::sync_with_stdio(false);
  113.     cin.tie(nullptr);
  114.     int n; cin >> n;
  115.     seg.resize(n);
  116.     for (int i = 0; i < n; i++) {
  117.         cin >> seg[i].first >> seg[i].second;
  118.     }
  119.     vector<int> compress;
  120.     {
  121.         for (int i = 0; i < n; i++) {
  122.             compress.push_back(seg[i].first);
  123.             compress.push_back(seg[i].second);
  124.         }
  125.         sort(all(compress));
  126.         compress.resize(unique(all(compress)) - compress.begin());
  127.         for (int i = 0; i < n; i++) {
  128.             auto&& [l, r] = seg[i];
  129.             l = lower_bound(all(compress), l) - compress.begin();
  130.             r = lower_bound(all(compress), r) - compress.begin();
  131.         }
  132.     }
  133.     jump_l.resize(n);
  134.     Segtree T;
  135.     T.init((int)compress.size());
  136.     for (int i = 0; i < n; i++) {
  137.          int ind = T.get_max(seg[i].first, seg[i].second);
  138.          jump_l[i] = ind;
  139.          T.update(seg[i].first, seg[i].second, i);
  140.     }
  141.  
  142.     T.t.clear();
  143.     T.n = {};
  144.  
  145.     reverse(all(seg));
  146.     jump_r.resize(n);
  147.     T.init((int)compress.size());
  148.     for (int i = 0; i < n; i++) {
  149.         int ind = T.get_max(seg[i].first, seg[i].second);
  150.         jump_r[n - i - 1] =  n - ind - 1;
  151.         T.update(seg[i].first, seg[i].second, i);
  152.     }
  153.     reverse(all(seg));
  154.  
  155.     for (int i = 0; i < n; i++) {
  156.         cout << jump_l[i] << ' ';
  157.     }
  158.     cout << '\n';
  159.     for (int i = 0; i < n; i++) {
  160.         cout << jump_r[i] << ' ';
  161.     }
  162.     //
  163.     //int q; cin >> q;
  164.     //query.resize(q);
  165.     //ans.resize(q);
  166.     //mrg.resize(n * 20ll);
  167.     //ind_query.resize(n);
  168.     //pref.resize(n);
  169.     //suf.resize(n);
  170.     //for (int i = 0; i < q; i++) {
  171.     //  int x, y; cin >> x >> y;
  172.     //  x--, y--;
  173.     //  query[i] = make_pair(x, y);
  174.     //  ind_query[x].push_back(i);
  175.     //  ind_query[y].push_back(i);
  176.  
  177.     //}
  178.     //while (q--) {
  179.     //  int x, y; cin >> x >> y;
  180.     //  x--, y--;
  181.     //  int res = 1, lst = x;
  182.     //  /*for (int i = x; i <= y; i++) {
  183.     //      if (jump_l[i] >= lst) {
  184.     //          res++;
  185.     //          lst = i;
  186.     //      }
  187.     //  }*/
  188.     //  cout << res << '\n';
  189.     //}
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement