Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int W = 1e5 + 10;
- const int M = 1e4 + 10;
- using pi = pair <int, int>;
- using piI = pair <int, pi>;
- vector <piI> event[W];
- vector <pi> query[W];
- vector <pi> ans;
- int tree[1<<19], lazy[1<<19];
- int n, m, k;
- int Cal(int a, int b);
- void Lazy(int idx, int l, int r);
- void Update(int idx, int l, int r, int s, int e, int val);
- int Query(int idx, int l, int r, int pst);
- int main(){
- scanf("%d%d%d", &n, &m, &k);
- for(int i=1;i<=n;i++){
- int x1, x2, y1, y2;
- scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
- event[x1].push_back({1, {y1, y2}}); /// update 1
- event[x2+1].push_back({-1, {y1, y2}}); /// update -1
- }
- for(int i=1;i<=m;i++){
- int x, y;
- scanf("%d%d", &x, &y);
- query[x].push_back({y, i});
- }
- for(int x=0;x<=1e5;x++){
- if(!event[x].empty()){
- for(auto e: event[x]){
- int val = e.first;
- int S = e.second.first;
- int E = e.second.second;
- Update(1, 0, 1e5, S, E, val);
- }
- }
- if(!query[x].empty()){
- for(auto q: query[x]){
- int y = q.first;
- int idx = q.second;
- ans.push_back({idx, Query(1, 0, 1e5, y)});
- }
- }
- }
- sort(ans.begin(), ans.end());
- for(auto i: ans) printf("%d\n", i.second);
- return 0;
- }
- int Cal(int a, int b){
- return a + b;
- }
- void Lazy(int idx, int l, int r){
- if(lazy[idx] == 0) return;
- tree[idx] += (r-l+1) * lazy[idx];
- if(l != r){
- lazy[2*idx] += lazy[idx];
- lazy[2*idx + 1] += lazy[idx];
- }
- lazy[idx] = 0;
- }
- void Update(int idx, int l, int r, int s, int e, int val){
- Lazy(idx, l, r);
- if(l > e or r < s) return;
- if(s <= l and r <= e){
- if(l != r){
- lazy[2*idx] += val;
- lazy[2*idx + 1] += val;
- }
- tree[idx] += (r-l+1) * val;
- return;
- }
- int mid = (l + r) / 2;
- Update(2*idx, l, mid, s, e, val);
- Update(2*idx + 1, mid + 1, r, s, e, val);
- tree[idx] = Cal(tree[2*idx], tree[2*idx + 1]);
- }
- int Query(int idx, int l, int r, int pst){
- Lazy(idx, l, r);
- if(l == r) return tree[idx];
- int mid = (l + r) / 2;
- if(pst <= mid) return Query(2*idx, l, mid, pst);
- else return Query(2*idx + 1, mid + 1, r, pst);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement