Advertisement
Ritam_C

Untitled

Sep 8th, 2021
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.99 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. typedef long long ll;
  3. #define F first
  4. #define S second
  5. using namespace std;
  6.  
  7. int ltx(vector<pair<ll, int>> v, ll x){
  8.     int s = 0, e = v.size()-1;
  9.     int ans = -1;
  10.     while(e >= s){
  11.         int m = s+(e-s)/2;
  12.         if(v[m].F <= x){
  13.             ans = m;
  14.             s = m+1;
  15.         } else{
  16.             e = m-1;
  17.         }
  18.     }
  19.     return ans;
  20. }
  21.  
  22. struct Node {
  23.     vector<pair<ll, int>> v;
  24.  
  25.     void setSize(int n) {
  26.         v.assign(n, {1000000007, 0});
  27.         for(int i = 0; i < n; i++) {
  28.             v[i] = {1000000007, i};
  29.         }
  30.     }
  31. };
  32.  
  33. struct segTree {
  34.     int size = 1;
  35.     vector<Node> nodes;
  36.    
  37.     Node NEUTRAL;
  38.  
  39.     void init(int n) {
  40.         while(size < n) {
  41.             size *= 2;
  42.         }
  43.         NEUTRAL.setSize(1);
  44.         nodes.assign(2*size, NEUTRAL);
  45.     }
  46.  
  47.     Node merge(Node a, Node b) {
  48.         Node fin; fin.setSize(a.v.size()+b.v.size());
  49.         int i = 0, j = 0, k = 0;
  50.         while(i < a.v.size() && j < b.v.size() && k < fin.v.size()) {
  51.             if(a.v[i].F < b.v[j].F) {
  52.                 fin.v[k] = a.v[i];
  53.                 i++;
  54.             } else {
  55.                 fin.v[k] = b.v[j];
  56.                 j++;
  57.             }
  58.             k++;
  59.         }
  60.         while(i < a.v.size() && k < fin.v.size()) {
  61.             fin.v[k] = a.v[i];
  62.             i++; k++;
  63.         }
  64.         while(j < a.v.size() && k < fin.v.size()) {
  65.             fin.v[k] = b.v[j];
  66.             j++; k++;
  67.         }
  68.         return fin;
  69.     }
  70.  
  71.     void set(int i, ll val, int x, int lx, int rx) {
  72.         if(rx-lx == 1) {
  73.             nodes[x].v[0] = {val, i};
  74.             return;
  75.         }
  76.         int m = (lx+rx)/2;
  77.         if(i < m) {
  78.             set(i, val, 2*x+1, lx, m);
  79.         } else {
  80.             set(i, val, 2*x+2, m, rx);
  81.         }
  82.         nodes[x] = merge(nodes[2*x+1], nodes[2*x+2]);
  83.     }
  84.  
  85.     void set(int i, ll val) {
  86.         set(i, val, 0, 0, size);
  87.     }
  88.  
  89.     Node getNode(int l, int r, int x, int lx, int rx) {
  90.         if(lx >= r || rx <= l) {
  91.             return NEUTRAL;
  92.         }
  93.         if(l <= lx && rx <= r) {
  94.             return nodes[x];
  95.         }
  96.         int m = (lx+rx)/2;
  97.         return merge(getNode(l, r, 2*x+1, lx, m), getNode(l, r, 2*x+2, m, rx));
  98.     }
  99.  
  100.     Node getNode(int l, int r) {
  101.         return getNode(l, r, 0, 0, size);
  102.     }
  103. };
  104.  
  105. int main(){
  106.     ios_base::sync_with_stdio(false);
  107.     cin.tie(NULL); cout.tie(NULL);
  108.     int n, m; cin >> n >> m;
  109.     segTree st; st.init(n);
  110.     while(m--) {
  111.         int op; cin >> op;
  112.         if(op == 1) {
  113.             int i; ll val;
  114.             cin >> i >> val;
  115.             st.set(i, val);
  116.         } else {
  117.             int l, r; ll p;
  118.             cin >> l >> r >> p;
  119.             Node ans = st.getNode(l, r);
  120.             int temp = ltx(ans.v, p);
  121.             cout << ltx(ans.v, p)+1 << "\n";
  122.             for(int i = 0; i <= temp; i++) {
  123.                 st.set(ans.v[i].S, 1000000009);
  124.             }
  125.         }
  126.     }
  127.     return 0;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement