Advertisement
TrickmanOff

sol informatics №934 91p. fast sort

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