Cod sursa(job #2883979)

Utilizator smunteanuMunteanu Stefan Catalin smunteanu Data 2 aprilie 2022 01:42:14
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
using namespace std;

const int nmax = 1e5 + 1;

static int n, m;
static int a[nmax];
static int aint[nmax * 2];


// Ok
void makeAint(int b, int e, int i) {
  if (b == e) {
    aint[i] = a[b];
    return;
  }
  int m = (b + e) / 2;
  makeAint(b, m, 2 * i);
  makeAint(m + 1, e, 2 * i + 1);
  aint[i] = max(aint[i * 2], aint[i * 2 + 1]);
}

void update(int b, int e, int i, int j, int v) {
  if (b == e) {
    aint[i] = v;
    return;
  }
  int m = (b + e) / 2;
  if (j <= m) update(b, m, 2 * i, j, v);
  if (j > m) update(m + 1, e, 2 * i + 1, j, v);
  aint[i] = max(aint[i * 2], aint[i * 2 + 1]);
}

int query(int b, int e, int l, int r, int i) {
  if (l <= b && e <= r) return aint[i];
  int m = (b + e) / 2;
  if (r <= m) return query(b, m, l, r, i * 2);
  if (m < l) return query(m + 1, e, l, r, i * 2 + 1);
  return max(query(b, m, l, r, i * 2), query(m + 1, e, l, r, i * 2 + 1));
}

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

  cin >> n >> m;
  
  for (int i = 1; i <= n; i++) cin >> a[i];

  makeAint(1, n, 1);

  int c, a, b;
  for (int i = 0; i < m; i++) {
    cin >> c >> a >> b;
    if (c == 0) cout << query(1, n, a, b, 1) << '\n';
    if (c == 1) update(1, n, 1, a, b);
  }
  

}