Advertisement
Zeinab_Hamdy

seg

Jun 30th, 2024
620
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.42 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define nl "\n"
  4. #define fi first
  5. #define se second
  6. #define pb push_back
  7. #define ll long long
  8. #define RV return void
  9. #define sz(x) int(x.size())
  10. #define all(v) v.begin(), v.end()
  11. #define rall(v) v.rbegin(), v.rend()
  12. #define fixed(n) fixed << setprecision(n)
  13. #define cin(v) for(auto&x:v) cin >> x;
  14. #define cout(v) for(auto&x:v) cout << x << " ";
  15. void files(){
  16.     #ifndef ONLINE_JUDGE
  17.        freopen("input.txt", "r", stdin);
  18.        freopen("output.txt", "w", stdout);
  19.     #endif
  20. }
  21.  
  22. struct Node{
  23.  
  24.     int mx;
  25.  
  26.     Node(){
  27.        mx=-1;
  28.     }
  29.  
  30.     Node(int x){
  31.         mx=x;
  32.     }
  33.    
  34. };
  35.  
  36. struct SegTree{
  37.     int tree_size;
  38.     vector<Node> tree;
  39.  
  40.     SegTree(int n){
  41.         tree_size = 1;
  42.         while (tree_size < n) tree_size *= 2;
  43.         tree.assign(2 * tree_size, Node());
  44.     }
  45.  
  46.     Node merge(Node &left, Node &right){
  47.         Node ans = Node();
  48.         ans.mx = max(left.mx , right.mx);
  49.         return ans;
  50.     }
  51.  
  52.     void build(vector<int> & v, int node, int lx, int rx){
  53.         if(rx - lx == 1){
  54.             if(lx < sz(v) )
  55.                 tree[node] = Node(v[lx]);
  56.             return;
  57.         }
  58.         int md = lx + (rx - lx) / 2;
  59.  
  60.         build(v, 2 * node + 1, lx, md);
  61.         build(v, 2 * node + 2, md, rx);
  62.  
  63.         tree[node] = merge(tree[2 * node + 1], tree[2 * node + 2]);
  64.     }
  65.  
  66.     void build(vector<int> & v){
  67.         build(v, 0, 0, tree_size);
  68.     }
  69.  
  70.     void set(int idx,int val , int node, int lx, int rx){
  71.         if(rx - lx == 1){
  72.             tree[node] = Node(val);
  73.             return;
  74.         }
  75.         int md = lx + (rx - lx) / 2;
  76.  
  77.         if(idx < md)
  78.             set(idx,val, 2 * node + 1, lx, md);
  79.         else
  80.             set(idx,val, 2 * node + 2, md, rx);
  81.  
  82.         tree[node] = merge(tree[2 * node + 1], tree[2 * node + 2]);
  83.     }
  84.  
  85.     void set(int idx , int val){
  86.         set(idx, val, 0, 0, tree_size);
  87.     }
  88.  
  89.     int get(int x , int lst , int node, int lx, int rx){
  90.  
  91.         if(rx - lx == 1){
  92.             // return (tree[node].mx >= x and lx >= lst ? lx : -1);
  93.             // cout << "node : " << node << " -> " << lx << " " << rx << nl;
  94.             return lx;
  95.         }
  96.  
  97.         Node left = tree[node*2+1];
  98.         int md = lx + (rx - lx) / 2;
  99.  
  100.         if(left.mx >= x and lst < md  )
  101.             return  get(x , lst , 2 * node + 1, lx , md);
  102.         else  if(tree[node*2+2].mx >= x and lst < rx )
  103.             return  get( x , lst , 2 * node +2, md , rx);
  104.  
  105.         return -1;
  106.     }
  107.  
  108.     int get(int x , int lst){
  109.         return get(x , lst ,0, 0, tree_size);
  110.     }
  111. };
  112.  
  113.  
  114.  
  115. void solve(){
  116.    
  117.     int n , idx ,m , x , op , val , lst;
  118.  
  119.  
  120.     cin >> n >> m;
  121.  
  122.     vector<int>v(n);
  123.     cin(v);
  124.     SegTree seg(n);
  125.     seg.build(v);
  126.  
  127.  
  128.     while(m--){
  129.         cin >> op;
  130.         if(op==1){
  131.             cin >> idx >> val;
  132.             v[idx]=val;
  133.             seg.set(idx , val);
  134.         }
  135.         else{
  136.             cin >> x >> lst;
  137.             int ans =seg.get(x , lst);
  138.             cout << ans << nl;
  139.         }
  140.     }
  141.  
  142.  
  143.    
  144. }
  145.  
  146.  
  147.  
  148.  
  149. int main(){
  150.     ios_base::sync_with_stdio(false);
  151.     cin.tie(nullptr);
  152.     cout.tie(nullptr);
  153.                            
  154.     //  files();
  155.    
  156.    
  157.     int testCase=1;
  158.         // cin >> testCase ;
  159.     for(int i=1 ; i <= testCase ; i++){
  160.         // cout << "Case "<< i <<": ";
  161.         solve();
  162.     }
  163.  
  164.     return 0;
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement