Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // OBI 2015 - 2nd Stage - Fila
- // Lúcio Cardoso
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn = 1200010;
- struct Query
- {
- int type;
- int ind, x;
- } Q[maxn];
- int a[maxn];
- int where[maxn], val[maxn], pos[maxn];
- int bit[maxn];
- int tree[4*maxn];
- void upd_bit(int x, int v)
- {
- for (; x < maxn; x += (x&-x))
- bit[x] += v;
- }
- int soma_bit(int x)
- {
- int ans = 0;
- for (; x > 0; x -= (x&-x))
- ans += bit[x];
- return ans;
- }
- int busca(int x)
- {
- int pos = 0, soma = 0;
- for (int i = 20; i >= 0; i--)
- {
- if (pos+(1<<i) < maxn && soma + bit[pos+(1<<i)] < x)
- {
- pos += (1<<i);
- soma += bit[pos];
- }
- }
- return pos+1;
- }
- void upd(int node, int l, int r, int pos, int v)
- {
- if (l == r)
- {
- tree[node] = v;
- return;
- }
- int mid = (l+r)>>1;
- if (pos <= mid) upd(2*node, l, mid, pos, v);
- else upd(2*node+1, mid+1, r, pos, v);
- tree[node] = max(tree[2*node], tree[2*node+1]);
- }
- int query(int node, int l, int r, int pos, int v)
- {
- if (tree[node] <= v || l > pos) return 0;
- if (l == r) return l;
- int mid = (l+r)>>1;
- int p1 = query(2*node+1, mid+1, r, pos, v);
- return (p1 ? p1 : query(2*node, l, mid, pos, v));
- }
- int main(void)
- {
- int n;
- scanf("%d", &n);
- for (int i = 1; i <= n; i++)
- scanf("%d", &a[i]);
- int m;
- scanf("%d", &m);
- for (int i = 1; i <= m; i++)
- scanf("%d %d %d", &Q[i].type, &Q[i].ind, &Q[i].x);
- for (int i = 1; i < maxn; i++)
- upd_bit(i, 1);
- for (int i = m; i >= 1; i--)
- {
- if (Q[i].type == 0)
- {
- where[i] = busca(Q[i].ind+1);
- val[where[i]] = Q[i].x;
- upd_bit(where[i], -1);
- }
- }
- for (int i = n; i >= 1; i--)
- {
- pos[i] = busca(i);
- val[pos[i]] = a[i];
- upd_bit(pos[i], -1);
- upd(1, 1, maxn-1, pos[i], a[i]);
- }
- memset(bit, 0, sizeof bit);
- for (int i = 1; i <= n; i++)
- upd_bit(pos[i], 1);
- for (int i = 1; i <= m; i++)
- {
- if (Q[i].type == 0)
- {
- upd_bit(where[i], 1);
- upd(1, 1, maxn-1, where[i], Q[i].x);
- }
- else
- {
- int pos = busca(Q[i].ind);
- printf("%d\n", soma_bit(query(1, 1, maxn-1, pos, val[pos]+Q[i].x)));
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement