Cod sursa(job #1984163)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 23 mai 2017 21:14:45
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int MAX_N = 100000;

int aint[4 * MAX_N];
int ans;

void update(int nod, int st, int dr, int poz, int val) {
  if (st == dr) {
    aint[nod] = val;
    return ;
  }
  int med = (st + dr) / 2;
  if (poz <= med)
    update(2 * nod, st, med, poz, val);
  else
    update(2 * nod + 1, med + 1, dr, poz, val);
  aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}

void query(int nod, int st, int dr, int a, int b) {
  if (a <= st && dr <= b) {
    ans = max(ans, aint[nod]);
    return ;
  }
  int med = (st + dr) / 2;
  if (a <= med)
    query(2 * nod, st, med, a, b);
  if (b > med)
    query(2 * nod + 1, med + 1, dr, a, b);
}

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

  int N, M;
  scanf("%d%d", &N, &M);

  for (int n = 1; n <= N; ++n) {
    int x;
    scanf("%d", &x);
    update(1, 1, N, n, x);
  }

  for (int m = 1; m <= M; ++m) {
    int tip, a, b;
    scanf("%d%d%d", &tip, &a, &b);
    if (tip == 0) {
      ans = 0;
      query(1, 1, N, a, b);
      printf("%d\n", ans);
    } else {
      update(1, 1, N, a, b);
    }
  }

  return 0;
}