Advertisement
Manioc

fila_seg_bit

Aug 10th, 2018
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.65 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 6000007
  3.  
  4. using namespace std;
  5. typedef long long ll;
  6.  
  7. struct q{
  8.     int type, pos;
  9.     ll val;
  10.     q(int _type, int _pos, ll _val) : type(_type), pos(_pos), val(_val){}
  11. };
  12. ll bit[2][MAX], seg[4*MAX], h[MAX], freq[MAX], n;
  13.  
  14. void bit_update(int id, int idx, ll val){
  15.     idx = idx + 1;
  16.     for(; idx <= MAX; idx += idx&(-idx)) bit[id][idx] += val;
  17. }
  18.  
  19. ll sum(int id, int idx){
  20.     idx = idx + 1;
  21.     ll ans = 0;
  22.     for(; idx > 0; idx -= idx&(-idx)) ans +=  bit[id][idx];
  23.     return ans;
  24. }
  25.  
  26. void update(int id, int l, int r, int idx, ll val){
  27.     if(r < idx || idx < l) return;
  28.     else if(l == r) seg[id] = val;
  29.     else{
  30.         int mid = (l+r)/2;
  31.         update(2*id, l, mid, idx, val);
  32.         update(2*id+1, mid+1, r, idx, val);
  33.  
  34.         seg[id] = max(seg[2*id], seg[2*id+1]);
  35.     }
  36. }
  37.  
  38. ll search(int id, int l, int r, int idx, ll val){
  39.     int mid = (l+r)/2;
  40.  
  41.     if(seg[id] <= val) return 0;
  42.     if(idx < l) return 0;
  43.    
  44.     if(l == r) return l;
  45.    
  46.     if(idx < r){
  47.         return max(search(2*id, l, mid, idx, val),
  48.                    search(2*id+1, mid+1, r, idx, val));
  49.     }
  50.  
  51.     if(seg[2*id+1] > val) return search(2*id+1, mid+1, r, idx, val);
  52.     return search(2*id, l , mid, idx, val);
  53. }
  54.  
  55. ll busca_binaria(int idx){
  56.     int l = 1, r = n;
  57.     while(l < r){
  58.         int mid = (l + r)/2;
  59.         if(sum(0, mid) >= idx) r =  mid;
  60.         else l = mid+1;
  61.     }
  62.  
  63.     return r;
  64. }
  65.  
  66. int print_tree(){
  67.     for(int i = 0; i <= 4*n; i++) cout << seg[i] << " \n"[i == 4*n];
  68. }
  69. vector<q> consultas;
  70. int main(){
  71.     scanf("%lld", &n);
  72.     for(int i = 1; i <= n; i++) {
  73.         int val; scanf("%d", &val);
  74.         consultas.emplace_back(0, i, val);
  75.         bit_update(1, i, 1);
  76.         freq[i]++;
  77.     }
  78.     int cases; scanf("%d", &cases);
  79.     for(int i = 0; i < cases; i++){
  80.         int type, x;
  81.         ll y; scanf("%d %d %lld", &type, &x, &y);
  82.         consultas.emplace_back(type, x, y);
  83.         if(type == 0){
  84.             bit_update(1, x, 1);
  85.             n++;
  86.             freq[x]++;
  87.         }
  88.     }
  89.  
  90.     for(int i = 0; i < consultas.size(); i++){
  91.         q actual = consultas[i];
  92.         if(actual.type == 0){
  93.             freq[actual.pos]--;
  94.             int pos = sum(1, actual.pos)-freq[actual.pos];
  95.             update(1, 1, n, pos, actual.val);
  96.             h[pos] = actual.val;
  97.             bit_update(0, pos, 1);
  98.         }else{
  99.             int pos = busca_binaria(actual.pos);
  100.  
  101.             cout << pos << endl;
  102.             ll maior = search(1, 1, n, pos, h[pos] + actual.val);
  103.             if(maior == 0) printf("0\n");
  104.             else printf("%lld\n", sum(0,maior));
  105.         }
  106.     }
  107.     return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement