Cod sursa(job #3312546)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 29 septembrie 2025 03:01:12
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>
using namespace std;

struct SegTree {
  int n;
  vector<int> arr;

  SegTree(const vector<int>& rra) : n(rra.size()), arr(2 * n) {
    for (int i = 0; i < n; i++) arr[n + i] = rra[i];
    for (int i = n - 1; i > 0; i--) arr[i] = max(arr[i << 1], arr[i << 1 | 1]);
  }

  void put(int i, int x) {
    i += n;
    arr[i] = x;
    for (i >>= 1; i > 0; i >>= 1) arr[i] = max(arr[i << 1], arr[i << 1 | 1]);
  }

  int get(int l, int r) {
    int x = INT_MIN;
    for (l += n, r += n; l <= r; l >>= 1, r >>= 1) {
      if (l & 1) x = max(x, arr[l++]);
      if (!(r & 1)) x = max(x, arr[r--]);
    }
    return x;
  }
};

int main() {
#ifndef LOCAL
  freopen("arbint.in", "r", stdin);
  freopen("arbint.out", "w", stdout);
#endif
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int N, M;
  cin >> N >> M;
  vector<int> arr(N);
  for (int i = 0; i < N; i++) cin >> arr[i];

  SegTree T(arr);

  while (M--) {
    int o, a, b;
    cin >> o >> a >> b;
    if (o) {
      // update: set position a to value b
      T.put(a - 1, b);
    } else {
      // query: max on [a, b]
      cout << T.get(a - 1, b - 1) << "\n";
    }
  }
}