ohwhatalovelyday

Untitled

Feb 13th, 2021
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.33 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define FASTER() ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
  4. #define ff first
  5. #define ss second
  6. #define pb push_back
  7. #define all(a) a.begin(), a.end()
  8. #define dbg(x) cerr<<" "<<#x<<" "<<x<<endl
  9.  
  10. typedef long long ll;
  11.  
  12. using namespace std;
  13.  
  14. const int maxn = 1e6 + 13;
  15.  
  16. struct point {
  17.     int x, y;
  18. };
  19.  
  20. bool cmp(point a, point b) {
  21.     if(a.x == b.x) return a.y < b.y;
  22.     return a.x < b.x;
  23. }
  24.  
  25. void print(vector <int> v) {
  26.     for(auto a : v) cout << a << ' ';
  27.     cout << endl;
  28. }
  29.  
  30. struct segTree {
  31.     int sz;
  32.     vector <vector <int>> tree;
  33.  
  34.     segTree() {
  35.        sz = 1;
  36.        while(sz < maxn) {
  37.            sz <<= 1;
  38.        }
  39.        tree.assign(2 * sz - 1, vector <int>());
  40.     }
  41.  
  42.     void upd(int x, int lx, int rx, int i, vector <int> &v) {
  43.         if(rx - lx == 1) {
  44.             tree[x] = v;
  45.             return;
  46.         }
  47.         int m = (lx + rx) >> 1;
  48.         if(i < m) {
  49.             upd(2 * x + 1, lx, m, i, v);
  50.         } else {
  51.             upd(2 * x + 2, m, rx, i, v);
  52.         }
  53.         tree[x] = tree[2 * x + 1];
  54.         tree[x].insert(tree[x].end(), all(tree[2 * x + 2]));
  55.         sort(all(tree[x]));
  56.     }
  57.  
  58.     void upd(int i, vector <int> &v) {
  59.         upd(0, 0, sz, i, v);
  60.     }
  61.  
  62.     void print() {
  63.         cout << "SEGTREE\n";
  64.         for(int i = 0; i < 10; i++) {
  65.             for(auto i : tree[i]) cout << i << " ";
  66.             cout << endl;
  67.         }
  68.     }
  69.  
  70.     int get(int x, int lx, int rx, int l, int r, int ly, int ry) {
  71.         if(l >= rx || r <= lx || x > tree.size()) {
  72.             return 0;
  73.         }
  74.         if(lx >= l && rx <= l) {
  75.             int f1 = lower_bound(all(tree[x]), ly) - tree[x].begin();
  76.             int f2 = upper_bound(all(tree[x]), ry) - tree[x].begin();
  77.             return f2 - f1;
  78.         }
  79.         int m = (lx + rx) >> 1;
  80.         int f1 = get(2 * x + 1, lx, m, l, r, ly, ry);
  81.         int f2 = get(2 * x + 2, m, rx, l, r, ly, ry);
  82.         return f1 + f2;
  83.     }
  84.  
  85.     int get(int l, int r, int ly, int ry) {
  86.         return get(0, 0, sz, l, r, ly, ry);
  87.     }
  88. };
  89.  
  90. int main() {
  91.     FASTER();
  92.     int n, q;
  93.     cin >> n >> q;
  94.     segTree st;
  95.     vector <point> p(n);
  96.     vector <point> build(n);
  97.     for(int i = 0; i < n; i++) {
  98.         int x, y;
  99.         cin >> x >> y;
  100.         p[i] = {x + y, x - y};
  101.         build[i] = p[i];
  102.     }
  103.  
  104.     sort(all(build), cmp);
  105.     vector <int> temp;
  106.     temp.pb(build[0].y);
  107.     for(int i = 1; i < n; i++) {
  108.         if(build[i - 1].x != build[i].x) {
  109.             st.upd(build[i - 1].x, temp);
  110.             temp = vector <int>{};
  111.         }
  112.         temp.pb(build[i].y);
  113.     }
  114.     if(temp.size() != 0) {
  115.         st.upd(build[n - 1].x, temp);
  116.     }
  117.  
  118.     for(int i = 0; i < q; i++) {
  119.         int id, k;
  120.         cin >> id >> k;
  121.         id--;
  122.         int x = p[id].x, y = p[id].y;
  123.         int l = 0, r = (int)1e6 + 1;
  124.         while(r - l > 1) { // ВОТ тут нужна помощь
  125.             int m = (l + r) >> 1;
  126.             int lx = min(m - x, m + x);
  127.             int rx = max(m - x, m + x);
  128.             int ly = min(m - y, m + y);
  129.             int ry = min(m - y, m + y);
  130.             if(st.get(lx, rx, ly, ry) <= k + 1) {
  131.                 l = m;
  132.             } else {
  133.                 m = m;
  134.             }
  135.         }
  136.         cout << l << endl;
  137.     }
  138. }
  139.  
Advertisement
Add Comment
Please, Sign In to add comment