Cod sursa(job #2187210)

Utilizator PetyAlexandru Peticaru Pety Data 26 martie 2018 12:14:52
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>

using namespace std;

int aint[200002], v[100002], sol;

void build (int nod, int st, int dr) {
  if (st == dr)
    aint[nod] = v[st];
  else {
    int med = (st + dr) / 2;
    build(2 * nod, st, med);
    build(2 * nod + 1, med + 1, dr);
    aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
  }
}

void update (int nod, int st, int dr, int pozV, int new_val) {
  if (st == dr)
    aint[nod] = new_val;
  else {
    int med = (st + dr) / 2;
    if (pozV <= med)
      update(2 * nod, st, med, pozV, new_val);
    if (pozV >= med + 1)
      update (2 * nod + 1, med + 1, dr, pozV, new_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)
    sol = max(sol, aint[nod]);
  else {
    int med = (st + dr) / 2;
    if (a <= med)
      query(2 * nod, st, med, a, b);
    if (b >= med + 1)
      query(2 * nod + 1, med + 1, dr, a, b);
  }
}
int cer, n, m, a, b;

int main()
{
  fin >> n >> m;
  for (int i = 1; i <= n; i++)
    fin >> v[i];
  build(1, 1, n);
  for (int i = 1; i <= m; i++) {
    fin >> cer >> a >> b;
    if (cer == 0) {
        sol = 0;
        query(1, 1, 5, a, b);
        fout << sol << "\n";
    }
    if (cer == 1) {
      update(1, 1, 5, a, b);
    }
  }
  return 0;
}