Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # include <iostream>
- using namespace std;
- pair<int, int> a[600010],t[4000010];
- int rev_a[600010];
- int n;
- void build(int tv, int tl, int tr){
- if(tl == tr){
- t[tv] = a[tl];
- return;
- }
- int tm = (tl + tr) / 2;
- build(tv * 2, tl , tm);
- build(tv * 2 + 1, tm + 1, tr);
- t[tv].first = t[tv * 2].first + t[tv * 2 + 1].first;
- }
- void change(int tv, int tl, int tr, int l, int r, int x){
- // cout << tv<<' '<<tl<<' '<<tr<<' '<<l<<' '<<r<<' '<<x<<'\n';
- if(r < tl || l > tr)
- return ;
- if(tl == l && tr == r){
- t[tv].second = x;
- if(x == 0)
- t[tv].first = 0;
- else
- t[tv].first = 1;
- return ;
- }
- int tm = (tl + tr) / 2;
- change(tv * 2, tl, tm, l, min(tm , r), x);
- change(tv * 2 + 1, tm + 1, tr, max(tm + 1, l), r, x);
- t[tv].first = t[tv * 2].first + t[tv * 2 + 1].first;
- }
- int get_ans(int tv, int tl, int tr, int l, int r){
- /*
- cout << tv<<' '<<tl<<' '<<tr<<' '<<l<<' '<<r<<'\n';
- */
- if(tl > r || tr < l)
- return 0;
- if(tl == l && tr == r){
- return t[tv].first;
- }
- int tm = (tl + tr) / 2;
- return get_ans(tv * 2, tl , tm, l , min(tm, r)) + get_ans(tv * 2 + 1, tm + 1, tr, max(tm + 1, l), r);
- }
- int find_pos(int tv, int tl, int tr, int x){
- //cout << tv<<' '<<tl<< ' '<<tr<<' '<<t[tv].first<<' '<<t[tv].second<<' '<<x<<'\n';
- if(tl == tr){
- return tl;
- }
- int an;
- int tm = (tl + tr) / 2;
- if(tl == tr){
- return tl;
- }
- if(t[tv * 2].first >= x)
- an = find_pos(tv * 2, tl ,tm, x);
- else
- an = find_pos(tv * 2 + 1, tm + 1, tr, x - t[tv * 2].first);
- return an;
- }
- int main()
- {
- int m, type;
- cin>> n>> m>> type;
- int si = n + m;
- for(int i = n + 1; i <= n + m; i ++){
- a[i].second = i - n;
- a[i].first = 1;
- rev_a[i - n] = i;
- }
- build(1, 1, si);
- int free_pos = n;
- if(type == 1){
- for(int i = 1; i <= n; i ++){
- int x, pos;
- cin>> x;
- //cout<< x<<' ';
- pos = rev_a[x];
- // cout << pos<<' ';
- int positive_cnt = get_ans(1, 1, si, 1, pos);
- cout <<positive_cnt<<' ';
- change(1, 1, si, pos, pos, 0);
- // cout << "step 1\n";
- rev_a[x] = free_pos;
- change(1, 1, si, free_pos, free_pos, x);
- free_pos--;
- }
- } else {
- for(int i = 1; i <= n; i ++){
- int x, pos;
- cin>> x;
- int an = find_pos(1, 1, si, x);
- cout <<a[an].second<<' ';
- pos = rev_a[x];
- change(1, 1, si, an, an, 0);
- rev_a[x] = free_pos;
- change(1, 1, si, free_pos, free_pos, a[an].first);
- a[free_pos] = a[an];
- a[an].first = 0;
- a[an].second = 0;
- free_pos--;
- }
- }
- }
- /*
- 7 3 1
- 2 3 1 2 1 1 1
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement