Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define mp make_pair
- #define mt make_tuple
- #define fi first
- #define se second
- #define pb push_back
- #define all(x) (x).begin(), (x).end()
- #define rall(x) (x).rbegin(), (x).rend()
- #define forn(i, n) for (ll i = 0; i < (ll)(n); ++i)
- #define for1(i, n) for (ll i = 1; i <= (ll)(n); ++i)
- #define ford(i, n) for (ll i = (ll)(n) - 1; i >= 0; --i)
- #define fore(i, a, b) for (ll i = (ll)(a); i <= (ll)(b); ++i)
- using namespace std;
- typedef pair<int, int> pii;
- typedef vector<int> vi;
- typedef vector<pii> vpi;
- typedef vector<vi> vvi;
- typedef long long ll;
- typedef vector<ll> vll;
- typedef vector<vll> vvll;
- typedef pair<ll, ll> pll;
- typedef double ld;
- int t[1700000];
- vector <set <pair <int, int>>> t1 (500000);
- vector <int> findv;
- void update (ll v, ll tl, ll tr, ll pos, int val, ll i) {
- if (pos > tr || pos < tl) {
- return;
- }
- if (tl == tr) {
- if (val == -1) {
- t[v] = -1;
- for (auto it : t1[pos]) {
- if (it.second == i) {
- t1[pos].erase(it);
- }
- else {
- t[v] = max (t[v], it.first);
- }
- }
- return;
- }
- t1[pos].insert({val, i});
- t[v] = max (t[v], val);
- return;
- }
- ll tm = (tl + tr) >> 1;
- update (v * 2, tl, tm, pos, val, i);
- update (v * 2 + 1, tm + 1, tr, pos, val, i);
- t[v] = max(t[v * 2], t[v * 2 + 1]);
- }
- int query (ll v, ll tl, ll tr, ll l, ll r) {
- if (tl > r || tr < l) {
- return -1;
- }
- if (l >= tl && r <= tr) {
- return t[v];
- }
- ll tm = (tl + tr) >> 1;
- ll q1 = query(v * 2, tl, tm, l, r);
- ll q2 = query(v * 2 + 1, tm + 1, tr, l, r);
- return max (q1, q2);
- }
- void search (ll v, ll tl, ll tr, ll x) {
- if (tl > x) {
- return;
- }
- if (tl == tr) {
- for (auto i : t1[tl]) {
- findv.push_back(i.second);
- }
- return;
- }
- ll tm = (tl + tr) >> 1;
- ll q1 = query(v * 2, tl, tm, tl, tm);
- ll q2 = query(v * 2 + 1, tm + 1, tr, tm + 1, tr);
- if (q1 > x) {
- search(v * 2, tl, tm, x);
- }
- if (q2 > x) {
- search(v * 2 + 1, tm + 1, tr, x);
- }
- }
- int main() {
- //freopen("17", "r", stdin);
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.precision(10);
- cout << fixed;
- ll n, x, y, start, end;
- int type;
- cin >> n;
- set <ll> m;
- vector <pair <int, pair <ll, ll>>> all_events (n + 10);
- forn (i, n) {
- cin >> type >> x >> y;
- all_events[i] = {type, {x, y}};
- if (type == 1) {
- start = x - y;
- end = x + y;
- m.insert(start);
- m.insert(end);
- }
- else {
- m.insert(x);
- }
- }
- map <ll, int> ctoi;
- ll it = 0;
- for (auto i : m) {
- ctoi[i] = it;
- it++;
- }
- it = 0;
- //vector <bool> used(m.size());
- for (auto i : all_events) {
- if (i.first == 1) {
- update(1, 0, m.size() - 1, ctoi[i.se.fi - i.se.se], ctoi[i.se.fi + i.se.se], it);
- }
- else {
- findv.clear();
- search(1, 0, m.size() - 1, ctoi[i.se.fi]);
- //cout << "find: " << findv.size() << "\n";
- bool ok = false;
- for (auto j : findv) {
- if ((all_events[j].se.fi - i.se.fi) * (all_events[j].se.fi - i.se.fi) +
- (all_events[j].se.se - i.se.se) * (all_events[j].se.se - i.se.se) < all_events[j].se.se * all_events[j].se.se) {
- cout << j + 1 << "\n";
- update(1, 0, m.size() - 1, ctoi[all_events[j].se.fi - all_events[j].se.se], -1, j);
- ok = true;
- break;
- }
- }
- if (!ok) {
- cout << "-1\n";
- }
- }
- it++;
- }
- }
- /*
- 2
- 1 24 10
- 2 16 14
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement