Cod sursa(job #3159064)

Utilizator pascarualexPascaru Alexandru pascarualex Data 20 octombrie 2023 17:14:56
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int N = (int) 1e5 + 7;
int n;
int t[4 * N];

void upd(int v, int tl, int tr, int i, int x) {
  if (tr < i || i < tl) return;
  if (tl == tr) {
    t[v] = x;
    return;
  }
  int tm = (tl + tr) / 2;
  upd(2 * v, tl, tm, i, x);
  upd(2 * v + 1, tm + 1, tr, i, x);
  t[v] = max(t[2 * v], t[2 * v + 1]);
}

int get(int v, int tl, int tr, int l, int r) {
  if (tr < l || r < tl) return -1;
  if (l <= tl && tr <= r) return t[v];
  int tm = (tl + tr) / 2;
  return max(get(2 * v, tl, tm, l, r), get(2 * v + 1, tm + 1, tr, l, r));
}

int main() {
  freopen ("arbint.in", "r", stdin);
  freopen ("arbint.out", "w", stdout);

  int m;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    int x;
    cin >> x;
    upd(1, 1, n, i, x);
  }
  for (int i = 1; i <= m; i++) {
    int tp, a, b;
    cin >> tp >> a >> b;
    if (tp == 0) {
      int l = a, r = b;
      cout << get(1, 1, n, l, r) << "\n";
    } else {
      int x = a, y = b;
      upd(1, 1, n, x, y);
    }
  }

  return 0;
}