Cod sursa(job #3329177)

Utilizator hrib_the_slothAndreea Pasca hrib_the_sloth Data 12 decembrie 2025 04:16:07
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>
using namespace std;
typedef long long i8;

class AINT {
 private:
  vector<int> v;
  int n;

  void build(int n, int st, int dr, const vector<int>& arr) {
    if (st == dr) {
      v[n] = arr[st];
    } else {
      int mid = (st + dr) / 2;
      build(n * 2, st, mid, arr);
      build(n * 2 + 1, mid + 1, dr, arr);
      v[n] = max(v[n * 2], v[n * 2 + 1]);
    }
  }

 public:
  void strt(int node, const vector<int>& arr) {
    n = node;
    v.assign(4 * node, 0);
    build(1, 0, n - 1, arr);
  };

  void update(int n, int st, int dr, int a, int b) {
    if (st == dr) {
      v[n] = b;
      return;
    }
    int mid = (st + dr) / 2;
    if (a <= mid)
      update(n * 2, st, mid, a, b);
    else
      update(n * 2 + 1, mid + 1, dr, a, b);
    v[n] = max(v[n * 2], v[n * 2 + 1]);
  }

  int query(int n, int st, int dr, int a, int b) {
    if (b < st || dr < a) return INT_MIN;
    if (a <= st && dr <= b) return v[n];
    int mid = (st + dr) / 2;
    int q1 = query(n * 2, st, mid, a, b);
    int q2 = query(n * 2 + 1, mid + 1, dr, a, b);
    return max(q1, q2);
  }
};

int main() {
  ifstream cin("arbint.in");
  ofstream cout("arbint.out");
  int n, m;
  cin >> n >> m;

  vector<int> arr(n);

  for (auto& e : arr) cin >> e;

  AINT seg;
  seg.strt(n, arr);

  for (int i = 0; i < m; i++) {
    int c, a, b;
    cin >> c >> a >> b;
    if (c == 1) {
      a--;
      seg.update(1, 0, n - 1, a, b);
    } else {
      a--;
      b--;
      cout << seg.query(1, 0, n - 1, a, b) << "\n";
    }
  }
  return 0;
}