Advertisement
999ms

Task N

Aug 12th, 2019
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | None | 0 0
  1. #pragma GCC target("avx")
  2.  
  3. #include "bits/stdc++.h"
  4. #define forn(i,n) for (int i = 0; i < (int)(n); i++)
  5.  
  6. using namespace std;
  7.  
  8. struct Node {
  9.     int l, r;
  10.     int a;
  11.     int tl, tr;
  12.     Node(int tl, int tr) : tl(tl), tr(tr), l(-1), r(-1), a(0) {}
  13. };
  14.  
  15. vector<Node> t;
  16. vector<int> vers;
  17.  
  18. void Check(int i) {
  19.     if (t[i].tl + 1 == t[i].tr) return;
  20.     if (t[i].l == -1) {
  21.         int tm = (t[i].tl + t[i].tr) / 2;
  22.         int size = t.size();
  23.         t[i].l = size;
  24.         t[i].r = size + 1;
  25.         t.emplace_back(t[i].tl, tm);
  26.         t.emplace_back(tm, t[i].tr);
  27.     }
  28. }
  29.  
  30. int Update(int i, int l, int r, int d) {
  31.     Check(i);
  32.     if (t[i].tl >= l && t[i].tr <= r) {
  33.         t.push_back(t[i]);
  34.         t.back().a += d;
  35.         return t.size() - 1;
  36.     } else {
  37.         int tm = (t[i].tl + t[i].tr) / 2;
  38.         int lAns = t[i].l;
  39.         int rAns = t[i].r;
  40.         if (tm > l) {
  41.             lAns = Update(t[i].l, l, r, d);
  42.         }
  43.         if (r > tm) {
  44.             rAns = Update(t[i].r, l, r, d);
  45.         }
  46.         t.push_back(t[i]);
  47.         t.back().l = lAns;
  48.         t.back().r = rAns;
  49.         return t.size() - 1;
  50.     }
  51. }
  52.  
  53. int Get(int i, int y) {
  54.     Check(i);
  55.     if (t[i].tl + 1 == t[i].tr) {
  56.         return t[i].a;
  57.     } else {
  58.         int tm = (t[i].tl + t[i].tr) / 2;
  59.         if (y < tm) {
  60.             return t[i].a + Get(t[i].l, y);
  61.         } else {
  62.             return t[i].a + Get(t[i].r, y);
  63.         }
  64.     }
  65. }
  66.  
  67.  
  68.  
  69. int main() {
  70.     ios_base::sync_with_stdio(false);
  71.     cin.tie(nullptr);
  72.     int n, m, a, b;
  73.     cin >> n >> m >> a >> b;
  74.     const int MSIZE = 300300;
  75.     vector<vector<pair<int,int> > > yy(MSIZE);
  76.  
  77.     for (int i = 0; i < a; i++) {
  78.         int x1, y1, x2, y2;
  79.         cin >> x1 >> y1 >> x2 >> y2;
  80.         yy[x1].push_back({y1, y2});
  81.         yy[x2 + 1].push_back({-y1 - 1, -y2 - 1});
  82.     }
  83.     t.emplace_back(0, MSIZE);
  84.     int cur = 0;
  85.     for (int i = 0; i < MSIZE; i++) {
  86.         for (auto y : yy[i]) {
  87.             int y1 = y.first;
  88.             int y2 = y.second;
  89.             if (y1 >= 0) {
  90.                 cur = Update(cur, y1, y2 + 1, 1);
  91.             } else {
  92.                 cur = Update(cur, -y1 - 1, -y2, -1);
  93.             }
  94.         }
  95.         vers.push_back(cur);
  96.     }
  97.  
  98.     while (b--) {
  99.         int x, y;
  100.         cin >> x >> y;
  101.         cout << Get(vers[x], y) << endl;
  102.     }
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement