Advertisement
TrickmanOff

sol informatics №934 91p. scanf

Aug 11th, 2019
256
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.17 KB | None | 0 0
  1. #include <stdio.h>
  2. #pragma optimization_level 3
  3. #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3")
  4. #include <iostream>
  5. #include <fstream>
  6. #include <iostream>
  7. #include <vector>
  8. #include <algorithm>
  9. #include <functional>
  10. #include <bitset>
  11. #include <string>
  12. #include <stack>
  13. #include <time.h>
  14. #include <random>
  15. #include <unordered_set>
  16. #include <queue>
  17. using namespace std;
  18.  
  19. #define ll long long
  20. //#define cin in
  21. //#define cout out
  22. #define pii pair<int, int>
  23. #define ld long double
  24. #define u_set unordered_set
  25. #define uid uniform_int_distribution
  26.  
  27. ifstream in("input.txt");
  28. ofstream out("output.txt");
  29.  
  30. int H, W, n, cur_h = 1, sz = 0;
  31. const int TREE_SZ = 524288, INF = 2e9;
  32. int tree[TREE_SZ];
  33.  
  34. struct line{
  35.     int len, h;
  36.     line() : len(W), h(cur_h++) {}
  37. };
  38.  
  39. //size of 'lines' = cur_h-1 in the beginning of each block
  40. vector<line> lines;
  41.  
  42. void upd(int v) {
  43.     int l = tree[2*v];
  44.     int r = tree[2*v+1];
  45.     if(r == INF || (l != INF && lines[l].h < lines[r].h))
  46.         tree[v] = l;
  47.     else
  48.         tree[v] = r;
  49. }
  50.  
  51. void build(int v, int lb, int rb) {
  52.     if(lb == rb) {
  53.         tree[v] = lb;
  54.         return;
  55.     }
  56.    
  57.     int mid = (lb + rb)/2;
  58.     build(2*v, lb, mid);
  59.     build(2*v+1, mid+1, rb);
  60.    
  61.     upd(v);
  62. }
  63.  
  64. void rebuild() {
  65.     fill(tree, tree+TREE_SZ, INF);
  66.     build(1, 0, sz-1);
  67. }
  68.  
  69. void del(int v, int lb, int rb, int pos) {
  70.     if(lb == rb && rb == pos) {
  71.         tree[v] = INF;
  72.         return;
  73.     }
  74.    
  75.     int mid = (lb + rb)/2;
  76.     if(pos <= mid)
  77.         del(2*v, lb, mid, pos);
  78.     else
  79.         del(2*v+1, mid+1, rb, pos);
  80.    
  81.     upd(v);
  82. }
  83.  
  84. void del(int pos) {
  85.     del(1, 0, sz-1, pos);
  86. }
  87.  
  88. int get_min(int v, int l, int r, int lb, int rb) {
  89.     if(l > rb || r < lb)
  90.         return INF;
  91.    
  92.     if(lb == l && rb == r)
  93.         return tree[v];
  94.    
  95.     int mid = (lb + rb)/2;
  96.    
  97.     int l_p = get_min(2*v, l, min(mid, r), lb, mid);
  98.     int r_p = get_min(2*v+1, max(mid+1, l), r, mid+1, rb);
  99.    
  100.     if(r_p == INF || (l_p != INF && lines[l_p].h < lines[r_p].h))
  101.         return l_p;
  102.     else
  103.         return r_p;
  104. }
  105.  
  106. int get_min(int l, int r) {
  107.     return get_min(1, l, r, 0, sz-1);
  108. }
  109.  
  110. //finds first num that has more or equal 'len' than 'a' and returns its position in the array
  111. int bin_search(int a) {
  112.     if(lines.back().len < a)
  113.         return -1;
  114.    
  115.     int l = -1, r = sz - 1;
  116.    
  117.     while(r - l > 1) {
  118.         int mid = (l+r)/2;
  119.         if(lines[mid].len >= a)
  120.             r = mid;
  121.         else
  122.             l = mid;
  123.     }
  124.    
  125.     return r;
  126. }
  127.  
  128. class Compare{
  129. public:
  130.     bool operator()(const line &a, const line &b) const {
  131.         return a.len < b.len;
  132.     }
  133. };
  134.  
  135. void resort(vector<line> &taken, vector<int> &poses) {
  136.     int p = 0;
  137.     for(int i: poses)
  138.         lines[i] = taken[p++];
  139.    
  140.     for(; p < taken.size(); p++)
  141.         lines.push_back(taken[p]);
  142.    
  143.     sort(lines.begin(), lines.end(), Compare());
  144.     sz = (int)lines.size();
  145. }
  146.  
  147. vector<int> queries;
  148.  
  149. void gen() {
  150.     int len = (int) sqrt(n) + 1;
  151.    
  152.     for(int bl = 0; bl <= len; bl++) {
  153.         vector<line> taken;
  154.         vector<int> poses;
  155.        
  156.         for(int i = bl*len; i < min(n, (bl+1) * len); i++) {
  157.            
  158.             int cur_w = queries[i];
  159.            
  160.             int tree_min = INF;
  161.            
  162.             if(sz > 0) {
  163.                 int p = bin_search(cur_w);
  164.                 if(p != -1)
  165.                     tree_min = get_min(p, sz-1);
  166.             }
  167.            
  168.             //минимальный подходящий из taken
  169.             int taken_pos = -1, taken_min = INF;
  170.             for(int j = 0; j < taken.size(); j++) {
  171.                 line x = taken[j];
  172.                
  173.                 if(x.len >= cur_w && x.h < taken_min) {
  174.                     taken_pos = j;
  175.                     taken_min = x.h;
  176.                 }
  177.             }
  178.            
  179.             int ans = -1;
  180.            
  181.             if(taken_min == INF && tree_min == INF) {
  182.                 if(cur_h > H || cur_w > W)
  183.                     ans = -1;
  184.                 else {
  185.                     ans = cur_h;
  186.                    
  187.                     taken.push_back(line());
  188.                     taken.back().len -= cur_w;
  189.                 }
  190.             }
  191.             else if(tree_min == INF || taken_min < lines[tree_min].h) {
  192.                 taken[taken_pos].len -= cur_w;
  193.                 ans = taken_min;
  194.             }
  195.             else {
  196.                 ans = lines[tree_min].h;
  197.                
  198.                 taken.push_back(lines[tree_min]);
  199.                 taken.back().len -= cur_w;
  200.                
  201.                 poses.push_back(tree_min);
  202.                
  203.                 lines[tree_min].h = INF;
  204.                
  205.                 del(tree_min);
  206.             }
  207.            
  208.             printf("%d%c", ans, '\n');
  209.         }
  210.        
  211.         if(!taken.empty()) {
  212.             resort(taken, poses);
  213.             rebuild();
  214.         }
  215.     }
  216. }
  217.  
  218. void input() {
  219.     scanf("%d%d%d", &H, &W, &n);
  220.     //cin >> H >> W >> n;
  221.     queries.resize(n);
  222.     for(int &x : queries)
  223.         scanf("%d", &x);
  224. }
  225.  
  226. int main()
  227. {
  228.     input();
  229.     gen();
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement