Advertisement
Korotkodul

A. ДО. RE 18

Jun 3rd, 2022 (edited)
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.28 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <queue>
  5. #include <algorithm>
  6. #include <string>
  7. #include <stack>
  8. #include <set>
  9. #include <map>
  10. #define pii pair <int,int>
  11. #define vec vector
  12. using namespace std;
  13. using ll = long long;
  14. using ld = long double;
  15. using db = double;
  16. void cv(vector <int> &v){
  17.     for (auto x: v) cout<<x<<' ';
  18.     cout<<"\n";
  19. }
  20.  
  21. void cvl(vector <ll> &v){
  22.     for (auto x: v) cout<<x<<' ';
  23.     cout<<"\n";
  24. }
  25.  
  26.  
  27. void cvv(vector <vector <int> > &v){
  28.     for (auto x: v) cv(x);
  29.     cout<<"\n";
  30. }
  31.  
  32. void cvb(vector <bool> v){
  33.     for (bool x: v) cout<<x<<' ';
  34.     cout<<"\n";
  35. }
  36.  
  37. void cvs(vector <string>  v){
  38.     for (auto a: v){
  39.         cout<<a<<"\n";
  40.     }
  41. }
  42.  
  43. int n,wide,q,gdN;
  44.  
  45. int wi,ans; //длина тек-го объявления
  46.  
  47. struct tree{
  48.     vector <int> v;//max
  49.     void bld(){
  50.         int  gdpow=log2(n);
  51.         if (pow(2, gdpow) < n) gdpow++;
  52.         gdN=pow(2,gdpow);
  53.         v.assign(2*gdN-1, wide);
  54.         int ch = gdN - n;
  55.         int i = 2*gdN-1;
  56.         while(ch--){
  57.             i--;
  58.             v[i]=0;
  59.         }
  60.         //cvl(v);
  61.     }
  62.  
  63.     void get(int l, int r, int id){
  64.         //cout<<"id = "<<id<<"\n";
  65.         if (l == r){//опустились в самый низ -- пора менять максимум
  66.             if (v[id] < wi){//дошли до самого правого, и он тоже не подошел
  67.                 ans=-1;
  68.                 return;
  69.             }
  70.  
  71.             ans = id - gdN + 2;
  72.  
  73.             v[id] -= wi;
  74.  
  75.             int idx = id;
  76.             while (idx > 0){
  77.                 idx = (idx-1) / 2;
  78.                 v[idx] = max(v[idx*2+1], v[idx*2+2]);
  79.             }
  80.  
  81.             return;
  82.         }
  83.  
  84.  
  85.         int m = (l + r) / 2;
  86.         if (v[2*id+1] >= wi){//влево
  87.             get(l, m, 2*id+1);
  88.         }
  89.         else{//вправо
  90.             get(m+1, r, 2*id+2);
  91.         }
  92.     }
  93. };
  94.  
  95.  
  96.  
  97. int main()
  98. {
  99.     ios::sync_with_stdio(0);
  100.     cin.tie(0);
  101.     cout.tie(0);
  102.     //n-- кол-во горизонталей, w - какая ширина сначала, q - кол-во запросов
  103.     cin>>n>>wide>>q;
  104.     tree T;
  105.     T.bld();
  106.     for (int i = 0; i < q;++i){
  107.         cin>>wi;
  108.         T.get(0, gdN-1, 0);
  109.         cout<<ans<<"\n";
  110.     }
  111. }
  112.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement