Advertisement
YEZAELP

PROG-1142: ศูนย์ประชุม (convention)

May 15th, 2021
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int N = 1e5;
  5. const int INF = 1e9;
  6. using pi = pair <int, int>;
  7. pi ar[N+10];
  8. int tree[1<<20], lazy[1<<20];
  9. vector <int> pst;
  10. int sz;
  11. int BS(int x);
  12.  
  13. void Lazy(int idx, int l, int r){
  14.     if(lazy[idx] == 0) return;
  15.     if(l != r){
  16.         lazy[2*idx] += lazy[idx];
  17.         lazy[2*idx+1] += lazy[idx];
  18.     }
  19.     tree[idx] += lazy[idx];
  20.     lazy[idx] = 0;
  21. }
  22.  
  23. void update(int idx, int l, int r, int s, int e){
  24.     Lazy(idx, l, r);
  25.     if(l > e or r < s) return;
  26.     if(s <= l and r <= e){
  27.         if(l != r){
  28.             lazy[2*idx] ++;
  29.             lazy[2*idx + 1] ++;
  30.         }
  31.         tree[idx] ++;
  32.         return;
  33.     }
  34.     int mid = (l + r) / 2;
  35.     update(2*idx, l, mid, s, e);
  36.     update(2*idx + 1, mid + 1, r, s, e);
  37.     tree[idx] = max(tree[2*idx], tree[2*idx+1]);
  38. }
  39.  
  40. int query(int idx, int l, int r, int s, int e){
  41.     Lazy(idx, l, r);
  42.     if(l > e or r < s) return -INF;
  43.     if(s <= l and r <= e) return tree[idx];
  44.     int mid = (l + r) / 2;
  45.     int L = query(2*idx, l, mid, s, e);
  46.     int R = query(2*idx+1, mid+1, r, s, e);
  47.     return max(L, R);
  48. }
  49.  
  50. int main(){
  51.  
  52.     int n, k;
  53.     scanf("%d%d", &n, &k);
  54.  
  55.     for(int i=1;i<=n;i++){
  56.         int u, v;
  57.         scanf("%d%d", &u, &v);
  58.         ar[i] = {u, v};
  59.         pst.push_back(u);
  60.         pst.push_back(v);
  61.     }
  62.  
  63.     sort(pst.begin(), pst.end());
  64.     pst.resize( unique(pst.begin(), pst.end()) - pst.begin() );
  65.     pst.insert(pst.begin(), 0);
  66.     sz = pst.size();
  67.  
  68.     for(int i=1;i<=n;i++){
  69.         int s = BS(ar[i].first);
  70.         int e = BS(ar[i].second);
  71.         int q = query(1, 1, sz-1, s, e);
  72.         if(q < k) {
  73.             printf("yes");
  74.             update(1, 1, sz-1, s, e);
  75.         }
  76.         else printf("no");
  77.         printf("\n");
  78.     }
  79.  
  80.     return 0;
  81. }
  82.  
  83. int BS(int x){
  84.     int l = 1, r = sz-1;
  85.     while(l <= r){
  86.         int mid = (l + r) / 2;
  87.         if(pst[mid] == x) return mid;
  88.         else if(pst[mid] < x) l = mid+1;
  89.         else r = mid-1;
  90.     }
  91. }
  92.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement