Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <math.h>
- #include <vector>
- #include <algorithm>
- #include <string>
- #include <numeric>
- #define int long long
- using namespace std;
- const int INF = 100000000000000;
- const int SIZE = 200200;
- int a[SIZE];
- int t[4 * SIZE];
- int sum = 0;
- int ans = 0;
- inline void build(int v, int l, int r) {
- if (r - l == 1) {
- t[v] = a[l];
- return;
- }
- int m = (l + r) / 2;
- build(2 * v + 1, l, m);
- build(2 * v + 2, m, r);
- t[v] = t[2 * v + 1] + t[2 * v + 2];
- }
- inline void find(int v, int l, int r, int pos) {
- if (r - l == 1)
- return;
- int m = (l + r) / 2;
- if (pos < m) {
- sum += t[2 * v + 2];
- find(2 * v + 1, l, m);
- }
- else {
- find(2 * v + 2, m, r);
- }
- }
- inline void ask(int v, int l, int r, int val) {
- if (r - l == 1) {
- ans = r;
- return;
- }
- int m = (l + r) / 2;
- if (t[2 * v + 1] >= val) {
- ask(2 * v + 1, l, m, val);
- }
- else {
- ask(2 * v + 2, m, r, val - t[2 * v + 1]);
- }
- }
- inline void change(int v, int l, int r, int pos) {
- if (r - l == 1) {
- t[v] = 1 - t[v];
- return;
- }
- int m = (l + r) / 2;
- if (pos < m) {
- change(2 * v + 1, l, m, pos);
- }
- else {
- change(2 * v + 2, m, r, pos);
- }
- t[v] = t[2 * v + 1] + t[2 * v + 2];
- }
- void solve() {
- for (int i = 0; i < SIZE; i++) {
- a[i] = 1;
- }
- int m; cin >> m;
- vector<int> q(m);
- build(0, 0, SIZE);
- for (int i = 0; i < m; i++)
- cin >> q[i];
- for (int i = 0; i < m; i++) {
- if (q[i] > 0) {
- find(0, 0, SIZE, q[i] - 1);
- int ths = t[0] - sum;
- sum = 0;
- ask(0, 0, SIZE, ths);
- cout << ans << "\n";
- ans = 0;
- change(0, 0, SIZE, q[i] - 1);
- }
- else {
- change(0, 0, SIZE, abs(q[i]) - 1);
- }
- }
- }
- signed main() {
- //freopen("rvq.in", "r", stdin);
- //freopen("rvq.out", "w", stdout);
- cin.tie(0);
- cout.tie(0);
- solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement