Cod sursa(job #2187224)

Utilizator PetyAlexandru Peticaru Pety Data 26 martie 2018 12:20:18
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("arbint.in");
ofstream fout ("arbint.out");

int aint[400002], 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, n, a, b);
        fout << sol << "\n";
    }
    if (cer == 1) {
      update(1, 1, n, a, b);
    }
  }
  return 0;
}