Cod sursa(job #2449489)

Utilizator ejoi2019Ejoi 2019 ejoi2019 Data 19 august 2019 22:11:52
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 100001;
int n, q;
int t[4 * N];

void upd(int v, int tl, int tr, int p, int x) {
  if (tr < p || p < tl)
    return;
  if (tl == tr)
    t[v] = x;
  else {
    int tm = (tl + tr) / 2;
    upd(2 * v, tl, tm, p, x);
    upd(2 * v + 1, tm + 1, tr, p, 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];
  else {
    int tm = (tl + tr) / 2;
    int a = get(2 * v, tl, tm, l, r);
    int b = get(2 * v + 1, tm + 1, tr, l, r);
    return max(a, b);
  }
}

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

  scanf("%d %d", &n, &q);
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    upd(1, 1, n, i, x);
  }

  while (q--) {
    int t, a, b;
    scanf("%d %d %d", &t, &a, &b);
    if (t == 0)
      printf("%d\n", get(1, 1, n, a, b));
    else
      upd(1, 1, n, a, b);
  }

  return 0;
}