Advertisement
Guest User

Untitled

a guest
Feb 26th, 2020
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.95 KB | None | 0 0
  1. # include <iostream>
  2. using namespace std;
  3. pair<int, int> a[600010],t[4000010];
  4. int  rev_a[600010];
  5. int n;
  6. void build(int tv, int tl, int tr){
  7.     if(tl == tr){
  8.         t[tv] = a[tl];
  9.         return;
  10.     }
  11.     int tm = (tl + tr) / 2;
  12.     build(tv * 2, tl , tm);
  13.     build(tv * 2 + 1, tm + 1, tr);
  14.     t[tv].first = t[tv * 2].first + t[tv * 2 + 1].first;
  15. }
  16.  
  17. void change(int tv, int tl, int tr, int l, int r, int x){
  18.   //  cout << tv<<' '<<tl<<' '<<tr<<' '<<l<<' '<<r<<' '<<x<<'\n';
  19.     if(r < tl || l > tr)
  20.         return ;
  21.     if(tl == l && tr == r){
  22.         t[tv].second = x;
  23.         if(x == 0)
  24.             t[tv].first = 0;
  25.         else
  26.             t[tv].first = 1;
  27.         return ;
  28.     }
  29.  
  30.     int tm = (tl + tr) / 2;
  31.     change(tv * 2, tl, tm, l, min(tm , r), x);
  32.     change(tv * 2 + 1, tm + 1, tr, max(tm + 1, l), r, x);
  33.     t[tv].first = t[tv * 2].first + t[tv * 2 + 1].first;
  34. }
  35.  
  36. int get_ans(int tv, int tl, int tr, int l, int r){
  37. /*
  38.     cout << tv<<' '<<tl<<' '<<tr<<' '<<l<<' '<<r<<'\n';
  39. */
  40.     if(tl > r || tr < l)
  41.         return 0;
  42.     if(tl == l && tr == r){
  43.         return t[tv].first;
  44.     }
  45.  
  46.     int tm  = (tl + tr) / 2;
  47.  
  48.     return get_ans(tv * 2, tl , tm, l , min(tm, r)) + get_ans(tv * 2 + 1, tm + 1, tr, max(tm  + 1, l), r);
  49. }
  50.  
  51. int find_pos(int tv, int tl, int tr, int x){
  52.     //cout << tv<<' '<<tl<< ' '<<tr<<' '<<t[tv].first<<' '<<t[tv].second<<' '<<x<<'\n';
  53.     if(tl == tr){
  54.         return tl;
  55.     }
  56.     int an;
  57.     int tm  = (tl + tr) / 2;
  58.     if(tl == tr){
  59.         return tl;
  60.     }
  61.     if(t[tv * 2].first >= x)
  62.         an = find_pos(tv  * 2, tl ,tm, x);
  63.     else
  64.         an = find_pos(tv * 2 + 1, tm  + 1, tr, x - t[tv * 2].first);
  65.     return an;
  66. }
  67.  
  68. int main()
  69. {
  70.     int m, type;
  71.     cin>> n>> m>> type;
  72.     int si = n + m;
  73.     for(int i = n + 1; i <= n + m; i ++){
  74.         a[i].second = i - n;
  75.         a[i].first = 1;
  76.         rev_a[i - n] = i;
  77.     }
  78.     build(1, 1, si);
  79.     int free_pos = n;
  80.     if(type == 1){
  81.         for(int i = 1; i <= n; i ++){
  82.             int x, pos;
  83.             cin>> x;
  84.             //cout<< x<<' ';
  85.             pos = rev_a[x];
  86.            // cout << pos<<' ';
  87.             int positive_cnt = get_ans(1, 1, si, 1, pos);
  88.             cout <<positive_cnt<<' ';
  89.             change(1, 1, si, pos, pos, 0);
  90.            // cout << "step 1\n";
  91.             rev_a[x] = free_pos;
  92.             change(1, 1, si, free_pos, free_pos, x);
  93.             free_pos--;
  94.  
  95.         }
  96.     } else {
  97.         for(int i = 1; i <= n; i ++){
  98.             int x, pos;
  99.             cin>> x;
  100.             int an = find_pos(1, 1, si, x);
  101.             cout <<a[an].second<<' ';
  102.             pos = rev_a[x];
  103.             change(1, 1, si, an, an, 0);
  104.             rev_a[x] = free_pos;
  105.             change(1, 1, si, free_pos, free_pos, a[an].first);
  106.             a[free_pos] = a[an];
  107.             a[an].first = 0;
  108.             a[an].second = 0;
  109.             free_pos--;
  110.         }
  111.     }
  112.  
  113.  
  114. }
  115. /*
  116. 7 3 1
  117. 2 3 1 2 1 1 1
  118. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement