Manioc

fila desgraçada

Aug 9th, 2018
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.05 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 100007
  3.  
  4. using namespace std;
  5.  
  6. int raiz, n;
  7. vector<int> block;
  8. vector<vector<int> > arr;
  9. int val[MAX];
  10.  
  11. int siz(int idx){
  12.     int ans = 0;
  13.     int actual = idx/raiz;
  14.     for(int i = 0; i < actual; i++) ans += arr[i].size();
  15.  
  16.     return ans;
  17. }
  18.  
  19. void build(){
  20.     raiz = (int) sqrt(n);
  21.     arr.assign(raiz+1, vector<int> ());
  22.     block.assign(raiz+1, 0);
  23.     int actual = -1;
  24.     for(int i = 0; i < n; i++){
  25.         //cout << i << " " << raiz << " " << (i%raiz) << endl;
  26.         if(i%raiz == 0) actual++;
  27.         arr[actual].push_back(val[i]);
  28.         block[actual] = max(block[actual], val[i]);
  29.     }
  30. }
  31.  
  32. void resize(int idx){
  33.     vector<int> old = arr[idx];
  34.     arr.erase(arr.begin()+idx);
  35.     block[idx] = 0;
  36.     block.insert(block.begin()+idx, 0);
  37.     vector<int> novo;
  38.     for(int i = 0; i < old.size(); i++){
  39.         if(novo.size() == raiz) {
  40.             arr.insert(arr.begin()+idx, novo);
  41.             idx++;
  42.             novo.clear();
  43.         }
  44.         novo.push_back(old[i]);
  45.         block[idx];
  46.     }
  47.     if(novo.size()){
  48.         arr.insert(arr.begin()+idx, novo);
  49.         novo.clear();
  50.     }
  51. }
  52.  
  53. void insert(int val, int idx){
  54.     int actual = idx/raiz;
  55.     //cout << actual << endl;
  56.  
  57.     idx = idx-siz(idx);
  58.     cout << idx << endl;
  59.     arr[actual].insert(arr[actual].begin() + idx, val);
  60.     cout << "inseriu\n";
  61.     block[actual] = max(block[actual], val);
  62.     raiz = sqrt(++n);
  63.     if(arr[actual].size() >=  2*raiz) resize(actual);
  64. }
  65.  
  66. int find(int idx, int val){
  67.     int block_idx = idx/raiz;
  68.  
  69.     cout << block_idx << " " << val << endl;
  70.     int borda = siz(idx)-1;
  71.     cout << idx << " " << borda << endl;
  72.     while(idx >= borda){
  73.         cout << "initial block\n";
  74.         if(arr[block_idx][idx] > val) return idx+1;
  75.         idx--;
  76.     }
  77.  
  78.     cout << idx << " " << borda << endl;
  79.     while(idx >= 0){
  80.         cout << "find a new block\n";
  81.         block_idx--;
  82.         if(block[block_idx] > val) break;
  83.         idx -= arr[block_idx].size()-1;
  84.     }
  85.  
  86.     borda = siz(idx);
  87.     cout << idx << " " << borda << endl;
  88.     while(idx >= borda){
  89.         cout << "final block\n";
  90.         if(arr[block_idx][idx] > val) return idx+1;
  91.         idx--;
  92.     }
  93.     return 0;
  94. }
  95.  
  96. void print(){
  97.     for(int i = 0; i < arr.size(); i++){
  98.         cout << "Raiz " << (i+1) << " = ";
  99.         for(int j = 0; j < arr[i].size(); j++){
  100.             cout << arr[i][j] << " \n"[j == arr[i].size()-1];
  101.         }
  102.     }
  103.     cout << "\nblocks = ";
  104.     for(int i = 0; i < block.size(); i++) cout << block[i] << " \n"[i == block.size()-1];
  105.     cout << "new raiz is " << raiz << endl;
  106. }
  107.  
  108. int main(){
  109.     cin >> n;
  110.     for(int i = 0; i < n; i++) cin >> val[i];
  111.     build();
  112.     print();
  113.     int q; cin >> q;
  114.     while(q--){
  115.         int type, x, y;  cin >> type >> x >> y;
  116.         x--;
  117.         if(type == 0){
  118.             insert(y, x);
  119.             print();
  120.         }else{
  121.             int z = arr[x/raiz][x-siz(x)];
  122.             cout << find(x, y+z) << endl;
  123.         }
  124.     }
  125.     return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment