Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include <bitset>
- #include <iostream>
- #include <stack>
- #include <queue>
- #include <set>
- #include <map>
- #include <string>
- #include <algorithm>
- using namespace std;
- const int N = 200100;
- int t[N << 2];
- int h, w, n, b;
- inline int child(int v) {
- return (v << 1) + 1;
- }
- inline int middle(int l, int r) {
- return (l+r) >> 1;
- }
- void build(int v, int l, int r) {
- if (l == r) {
- t[v] = w;
- return;
- }
- int ch = child(v);
- int mid = middle(l, r);
- build(ch, l, mid);
- build(ch + 1, mid + 1, r);
- t[v] = max(t[ch], t[ch + 1]);
- }
- void update(int v, int l, int r, int index, int value) {
- if (l == r) {
- t[v] = t[v] - value;
- return;
- }
- int ch = child(v);
- int mid = middle(l, r);
- if (index <= mid) update(ch, l, mid, index, value);
- else update(ch + 1, mid + 1, r, index, value);
- t[v] = max(t[ch], t[ch + 1]);
- }
- int q(int v, int l, int r, int find) {
- if (t[v] < find) return -1;
- if (l == r) return l;
- int ch = child(v);
- int mid = middle(l, r);
- if (t[ch] >= find) {
- return q(ch, l, mid, find);
- }
- else {
- return q(ch + 1, mid + 1, r, find);
- }
- }
- int main() {
- freopen("billboard.in", "r", stdin);
- freopen("billboard.out", "w", stdout);
- scanf("%d%d%d", &h, &w, &n);
- int treeSize = min(h, n) - 1;
- build(0, 0, treeSize);
- for (int i = 0; i < n; i++) {
- scanf("%d", &b);
- int r = q(0, 0, treeSize, b);
- if (r == -1) {
- printf("-1\n");
- continue;
- }
- printf("%d\n", 1 + r);
- update(0, 0, treeSize, r, b);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement