1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| #include <bits/stdc++.h> using namespace std; const int maxn = 2e5 + 50; #define lc p << 1 #define rc p << 1 | 1 int n, dis[maxn];
int mx[maxn << 2]; set<int> st[maxn << 2];
struct { int x, y; string op; } req[maxn];
void update(int p, int l, int r, int op, int x, int v) { if (l == r && x == l) { if (!op) st[p].emplace(v); else st[p].erase(v); mx[p] = st[p].empty() ? 0 : *(st[p].rbegin()); return; } int mid = (l + r) >> 1; if (x <= mid) update(lc, l, mid, op, x, v); if (x > mid) update(rc, mid + 1, r, op, x, v); mx[p] = max(mx[lc], mx[rc]); }
pair<int, int> ask(int p, int l, int r, int L, int R, int v) { if (L <= l && r <= R && l == r) { if (mx[p] > v) return {l, p}; return {-1, -1}; } int mid = (l + r) >> 1; pair<int, int> ans(-1, -1); if (L <= mid && mx[lc] > v) ans = ask(lc, l, mid, L, R, v); if (ans.first != -1) return ans; if (R > mid && mx[rc] > v) ans = ask(rc, mid + 1, r, L, R, v); return ans; }
int main() { ios::sync_with_stdio(false), cin.tie(0); int q; cin >> q; for (int i = 1; i <= q; ++i) { cin >> req[i].op >> req[i].x >> req[i].y; dis[++n] = req[i].x; } sort(dis + 1, dis + 1 + n); n = unique(dis + 1, dis + 1 + n) - 1 - dis; for (int i = 1; i <= q; ++i) { int x = lower_bound(dis + 1, dis + 1 + n, req[i].x) - dis; if (req[i].op[0] == 'a') { update(1, 1, n, 0, x, req[i].y); } else if (req[i].op[0] == 'r') { update(1, 1, n, 1, x, req[i].y); } else { pair<int, int> ans = ask(1, 1, n, x + 1, n, req[i].y); if (ans.first == -1) cout << -1 << endl; else cout << dis[ans.first] << " " << *(st[ans.second].lower_bound(req[i].y + 1)) << endl; } } return 0; }
|