Cod sursa(job #2499162)

Utilizator vladcociorvaVlad Cociorva vladcociorva Data 25 noiembrie 2019 16:25:14
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX = 100005;
int a[NMAX], t[4*NMAX], n, m;
void build(int v, int tl, int tr){
  if (tl == tr)
    t[v] = a[tl];
  else{
    int tm = tl + (tr - tl)/2;
    build(v*2, tl, tm);
    build(v*2+1, tm+1, tr);
    t[v] = max(t[v*2], t[v*2+1]);
  }
}
int get(int v, int tl, int tr, int l, int r){
   if (l > r) return 0;
   if (l == tl && r == tr)
     return t[v];
   else{
     int tm = tl + (tr - tl)/2;
     return max(get(v*2, tl, tm, l, min(r, tm)), get(v*2+1, tm+1, tr, max(l, tm+1), r));
   }
}
void upd(int v, int tl, int tr, int pos, int val){
  if (tl == tr)
    t[v] = val;
  else{
    int tm = tl + (tr - tl)/2;
    if (pos <= tm)
      upd(v*2, tl, tm, pos, val);
    else
      upd(v*2+1, tm+1, tr, pos, val);
    t[v] = max(t[v*2], t[v*2+1]);
  }
}
int main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);
  fin >> n >> m;
  for (int i = 1; i <= n; i++)
    fin >> a[i];
  build(1, 1, n);
  for (int i = 1; i <= m; i++){
    int q, x, y;
    fin >> q >> x >> y;
    if (q == 0)
      fout << get(1, 1, n, x, y) << '\n';
    else upd(1, 1, n, x, y);
  }
  return 0;

}