Advertisement
Guest User

Billboard_20.08.13

a guest
Aug 20th, 2013
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6. #include <bitset>
  7. #include <iostream>
  8. #include <stack>
  9. #include <queue>
  10. #include <set>
  11. #include <map>
  12. #include <string>
  13. #include <algorithm>
  14. using namespace std;
  15.  
  16. const int N = 200100;
  17. int t[N << 2];
  18.  
  19. int h, w, n, b;
  20.  
  21. inline int child(int v) {
  22.     return (v << 1) + 1;
  23. }
  24.  
  25. inline int middle(int l, int r) {
  26.     return (l+r) >> 1;
  27. }
  28.  
  29. void build(int v, int l, int r) {
  30.     if (l == r) {
  31.         t[v] = w;
  32.         return;
  33.     }
  34.     int ch = child(v);
  35.     int mid = middle(l, r);
  36.     build(ch, l, mid);
  37.     build(ch + 1, mid + 1, r);
  38.     t[v] = max(t[ch], t[ch + 1]);
  39. }
  40.  
  41. void update(int v, int l, int r, int index, int value) {
  42.     if (l == r) {
  43.         t[v] = t[v] - value;
  44.         return;  
  45.     }
  46.     int ch = child(v);
  47.     int mid = middle(l, r);
  48.     if (index <= mid) update(ch, l, mid, index, value);
  49.     else update(ch + 1, mid + 1, r, index, value);
  50.     t[v] = max(t[ch], t[ch + 1]);
  51. }
  52.  
  53. int q(int v, int l, int r, int find) {
  54.     if (t[v] < find) return -1;
  55.     if (l == r) return l;
  56.    
  57.     int ch = child(v);
  58.     int mid = middle(l, r);
  59.  
  60.     if (t[ch] >= find) {
  61.         return q(ch, l, mid, find);
  62.     }
  63.     else {
  64.         return q(ch + 1, mid + 1, r, find);
  65.     }
  66. }
  67.  
  68. int main() {
  69.     freopen("billboard.in", "r", stdin);
  70.     freopen("billboard.out", "w", stdout);
  71.     scanf("%d%d%d", &h, &w, &n);
  72.     int treeSize = min(h, n) - 1;
  73.    
  74.     build(0, 0, treeSize);
  75.  
  76.     for (int i = 0; i < n; i++) {
  77.         scanf("%d", &b);
  78.         int r = q(0, 0, treeSize, b);
  79.         if (r == -1) {
  80.             printf("-1\n");
  81.             continue;
  82.         }
  83.         printf("%d\n", 1 + r);
  84.         update(0, 0, treeSize, r, b);      
  85.     }  
  86.     return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement