Advertisement
YEZAELP

o58_oct_c2_strip

Jul 8th, 2021
927
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int W = 1e5 + 10;
  5. const int M = 1e4 + 10;
  6. using pi = pair <int, int>;
  7. using piI = pair <int, pi>;
  8. vector <piI> event[W];
  9. vector <pi> query[W];
  10. vector <pi> ans;
  11. int tree[1<<19], lazy[1<<19];
  12. int n, m, k;
  13.  
  14. int Cal(int a, int b);
  15. void Lazy(int idx, int l, int r);
  16. void Update(int idx, int l, int r, int s, int e, int val);
  17. int Query(int idx, int l, int r, int pst);
  18.  
  19. int main(){
  20.  
  21.     scanf("%d%d%d", &n, &m, &k);
  22.  
  23.     for(int i=1;i<=n;i++){
  24.         int x1, x2, y1, y2;
  25.         scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
  26.         event[x1].push_back({1, {y1, y2}}); /// update 1
  27.         event[x2+1].push_back({-1, {y1, y2}}); /// update -1
  28.     }
  29.  
  30.     for(int i=1;i<=m;i++){
  31.         int x, y;
  32.         scanf("%d%d", &x, &y);
  33.         query[x].push_back({y, i});
  34.     }
  35.  
  36.     for(int x=0;x<=1e5;x++){
  37.         if(!event[x].empty()){
  38.             for(auto e: event[x]){
  39.                 int val = e.first;
  40.                 int S = e.second.first;
  41.                 int E = e.second.second;
  42.                 Update(1, 0, 1e5, S, E, val);
  43.             }
  44.         }
  45.         if(!query[x].empty()){
  46.             for(auto q: query[x]){
  47.                 int y = q.first;
  48.                 int idx = q.second;
  49.                 ans.push_back({idx, Query(1, 0, 1e5, y)});
  50.             }
  51.         }
  52.     }
  53.  
  54.     sort(ans.begin(), ans.end());
  55.  
  56.     for(auto i: ans) printf("%d\n", i.second);
  57.  
  58.     return 0;
  59. }
  60.  
  61. int Cal(int a, int b){
  62.     return a + b;
  63. }
  64.  
  65. void Lazy(int idx, int l, int r){
  66.     if(lazy[idx] == 0) return;
  67.     tree[idx] += (r-l+1) * lazy[idx];
  68.     if(l != r){
  69.         lazy[2*idx] += lazy[idx];
  70.         lazy[2*idx + 1] += lazy[idx];
  71.     }
  72.     lazy[idx] = 0;
  73. }
  74.  
  75. void Update(int idx, int l, int r, int s, int e, int val){
  76.     Lazy(idx, l, r);
  77.     if(l > e or r < s) return;
  78.     if(s <= l and r <= e){
  79.         if(l != r){
  80.             lazy[2*idx] += val;
  81.             lazy[2*idx + 1] += val;
  82.         }
  83.         tree[idx] += (r-l+1) * val;
  84.         return;
  85.     }
  86.     int mid = (l + r) / 2;
  87.     Update(2*idx, l, mid, s, e, val);
  88.     Update(2*idx + 1, mid + 1, r, s, e, val);
  89.     tree[idx] = Cal(tree[2*idx], tree[2*idx + 1]);
  90. }
  91.  
  92. int Query(int idx, int l, int r, int pst){
  93.     Lazy(idx, l, r);
  94.     if(l == r) return tree[idx];
  95.     int mid = (l + r) / 2;
  96.     if(pst <= mid) return Query(2*idx, l, mid, pst);
  97.     else return Query(2*idx + 1, mid + 1, r, pst);
  98. }
  99.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement