Advertisement
esraa_syam

Untitled

Jul 13th, 2024
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.74 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2. using namespace std;
  3.  
  4. #define nl "\n"
  5. #define ll long long
  6. #define mod  1'000'000'007
  7. #define all(v) v.begin(), v.end()
  8. #define rall(v) v.rbegin(), v.rend()
  9. #define sz(v) (int) v.size()
  10.  
  11. template<typename T = int>
  12. istream &operator>>(istream &in, vector<T> &v) {
  13.     for (auto &x: v) in >> x;
  14.     return in;
  15. }
  16.  
  17. template<typename T = int>
  18. ostream &operator<<(ostream &out, const vector<T> &v) {
  19.     for (const T &x: v) out << x << " ";
  20.     return out;
  21. }
  22.  
  23. void Sira() {
  24.     ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
  25. #ifndef ONLINE_JUDGE
  26.     freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
  27. #endif
  28. }
  29. struct node {
  30.     ll val;
  31.  
  32.     node(){
  33.         val = -1e18;
  34.     }
  35.  
  36.     node(ll v){
  37.         val = v;
  38.     }
  39.  
  40.  
  41. };
  42.  
  43. struct SegTree{
  44.     int seg_size = 1;
  45.     vector < node > tree;
  46.  
  47.     SegTree(int n){
  48.         while(seg_size < n) seg_size *= 2;
  49.         tree.assign(2 * seg_size, node());
  50.     }
  51.  
  52.     node merge(node a, node b){
  53.         node res = node();
  54.         res.val = max(a.val, b.val);
  55.         return res;
  56.     }
  57.  
  58.     void build(vector < int > &a, int x, int lx, int rx){
  59.         if(rx - lx == 1){
  60.             if(lx < sz(a)){
  61.                 tree[x] = node(a[lx]);
  62.             }
  63.             return;
  64.         }
  65.         int m = (lx + rx) / 2;
  66.         build(a, 2 * x + 1, lx, m);
  67.         build(a, 2 * x + 2, m, rx);
  68.         tree[x] = merge(tree[2 * x + 1], tree[2 * x + 2]);
  69.     }
  70.  
  71.     void build(vector < int > &a){
  72.         build(a, 0, 0, seg_size);
  73.     }
  74.  
  75.     void update(int idx , int val , int ni , int lx , int rx){
  76.         if(rx - lx == 1){
  77.             tree[ni] = node(val);
  78.             return;
  79.         }
  80.         int m = (lx + rx) / 2;
  81.         if(idx < m){
  82.             update(idx, val, 2 * ni + 1, lx, m);
  83.         }else{
  84.             update(idx, val, 2 * ni + 2, m, rx);
  85.         }
  86.         tree[ni] = merge(tree[2 * ni + 1], tree[2 * ni + 2]);
  87.     }
  88.  
  89.     void update(int idx, int val){
  90.         update(idx, val, 0, 0, seg_size);
  91.     }
  92.  
  93.     node query(int l, int r, int ni, int lx, int rx){
  94.         if(lx >= r || l >= rx) return node();
  95.         if(lx >= l && rx <= r) return tree[ni];
  96.         int m = (lx + rx) / 2;
  97.         node s1 = query(l, r, 2 * ni + 1, lx, m);
  98.         node s2 = query(l, r, 2 * ni + 2, m, rx);
  99.         return merge(s1, s2);
  100.     }
  101.  
  102.     node query(int l, int r){
  103.         return query(l, r, 0, 0, seg_size);
  104.     }
  105. };
  106.  
  107.  
  108. void solve(){
  109.     int n;
  110.     cin >> n;
  111.     vector < int > v(n);
  112.     cin >> v;
  113.  
  114.     SegTree st(n);
  115.     st.build(v);
  116.  
  117.     cout << st.query(0, 3).val << nl;
  118.  
  119. }
  120.  
  121. int main() {
  122.     Sira();
  123.     int t = 1;
  124. //    cin >> t;
  125.     while(t--){
  126.         solve();
  127.     }
  128.     return 0;
  129. }
  130.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement