Cod sursa(job #3277637)

Utilizator kalkinTraian Omin kalkin Data 17 februarie 2025 00:10:50
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.54 kb
#include <bits/stdc++.h>
#define all(x) (x).begin(),(x).end()
using namespace std;

#ifndef DLOCAL
   #define cin fin
   #define cout fout
   ifstream cin("arbint.in");
   ofstream cout("arbint.out");
#endif

using ll = long long;
using ld = long double;

//#define int ll
#define sz(x) ((int)(x).size())

using pii = pair<int,int>;
using tii = tuple<int,int,int>;

template<typename T>
struct AINT {
   struct Node {
      int l, r;
      T data;
   };
   
   using ns = int;
   vector<Node> M;
   ns nil = 0;
   int newv(int a, int b, T c) { M.emplace_back(a, b, c); return sz(M) - 1; }
   AINT() { M.clear(); nil = newv(0, 0, T()); }
   
   
   ns root = nil;
   int L, R;
   void initaint(int l_, int r_) {
      L = l_;
      R = r_;
      nil = root = 0;
   }
   
   template<class CB> void walk(CB&& cb) { walk(cb, L, R); }
   template<class CB> void walk(CB&& cb, int l, int r) { root = walk(cb, l, r, root, L, R); }
   template<class CB> ns walk(CB&& cb, int l, int r, ns node, int cl, int cr) { 
      if(r < cl || cr < l) return node;
      if(node == nil) node = newv(nil, nil, T());
      if(l <= cl && cr <= r && !cb(node, cl, cr)) return node; 
      int mid = (cl + cr) >> 1;
      M[node].l = walk(cb, l, r, M[node].l, cl, mid);
      M[node].r = walk(cb, l, r, M[node].r, mid + 1, cr);
      M[node].data.pull(M[M[node].l].data, M[M[node].r].data);
      return node;
   }
   
   void erase() { M.clear(); M.shrink_to_fit(); }
};

const int inf = 1e9 + 500;

struct Max {
   int val;
   Max(int x = -inf): val(x) {;}
   void pull(const Max& a, const Max& b) {val = max(a.val, b.val); }
};

struct MaxAint : AINT<Max> {
   void upd(int p, int x) {
      walk([&](ns node, int cl, int cr) {
         M[node].data.val = x;
         return 0;
      }, p, p);
   }
   int query(int l, int r) {
      int mx = -1;
      walk([&](ns node, int cl, int cr) {
         mx = max(mx, M[node].data.val);
         return 0;
      }, l, r);
      return mx;
   }
   void init(vector<int> v) {
      initaint(1, sz(v) - 1);
      walk([&](ns node, int cl, int cr) {
         if(cl != cr) return 1;
         M[node].data.val = v[cl];
         return 0;
      }, 1, sz(v) - 1);
   }
};

signed main() {
   cin.tie(0) -> sync_with_stdio(0);
   int n, q;
   cin >> n >> q;
   vector<int> v(n + 1);
   for(auto &x : v | views::drop(1)) cin >> x;
   MaxAint aint;
   aint.init(v);
   for(int i = 0, t, x, y; i < q; i++) {
      cin >> t >> x >> y;
      if(t == 0)
         cout << aint.query(x, y) << '\n';
      else 
         aint.upd(x, y);
   }
}

/**
      Binecuvanteaza Doamne Ukraina.
--
*/