Cod sursa(job #2680453)

Utilizator etohirseCristi Cretu etohirse Data 3 decembrie 2020 16:20:56
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
//MlogN
#include <fstream>

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

const int mxn = 1e5 + 1;
int n, m, p, val, st, dr, mx;
int a[4 * mxn + 70];

void zero(int nod, int lb, int rb){
  if (lb == rb) { a[nod] = val; return; }
  int mb = (lb + rb) / 2;
  if (p <= mb) zero(2 * nod, lb, mb);
  else zero(2 * nod + 1, mb + 1, rb);
  a[nod] = std::max(a[2 * nod], a[2 * nod + 1]);
}

void uno(int nod, int lb, int rb){
  if (st <= lb && rb <= dr){ if (mx < a[nod]) mx = a[nod]; return; }
  int mb = (lb + rb) / 2;
  if (st <= mb) uno(2 * nod, lb, mb);
  else if (mb < dr) uno(2 * nod + 1, mb + 1, rb);
}

int main(){
  fin >> n >> m;
  for (int i = 1; i <= n; ++i){
    int z; fin >> z;
    p = i, val = z;
    zero(1,1,n);
  }

  for (int i = 1; i <= m; ++i){
    int x, y, z;
    fin >> x >> y >> z;
    if (x == 0){
      mx = -1;
      st = y, dr = z;
      uno(1,1,n);
      fout << mx << '\n';
    } else {
      p = y, val = z;
      zero(1,1,n);
    }
  }
  return 0;
}