Cod sursa(job #3189010)

Utilizator PescarusTanislav Luca Andrei Pescarus Data 4 ianuarie 2024 13:07:45
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>

using namespace std;
const int nmax = 100005;
int arbi[4 * nmax];
int v[nmax];

void build(int nod, int st, int dr){
  if(st == dr){
    arbi[nod] = v[st];
    return;
  }
  int mid = (st + dr) / 2;
  build(2 * nod, st, mid);
  build(2 * nod + 1, mid + 1, dr);
  arbi[nod] = max(arbi[2 * nod], arbi[2 * nod + 1]);
}

void update(int nod, int st, int dr, int x, int y){
  if(st == dr){
    arbi[nod] = y;
    return;
  }
  int mid = (st + dr) / 2;
  if(x <= mid){
    update(2 * nod, st, mid, x, y);
  }
  else{
    update(2 * nod + 1, mid + 1, dr, x, y);
  }
  arbi[nod] = max(arbi[2 * nod], arbi[2 * nod + 1]);
}

int query(int nod, int st, int dr, int x, int y){
  if(st == x && dr == y){
    return arbi[nod];
  }
  int mid = (st + st) / 2;
  if(y <= mid){
    return query(2 * nod, st, mid, x, y);
  }
  else if(x > mid){
    return query(2 * nod + 1, mid + 1, dr, x, y);
  }
  else{
    return max(query(2 * nod, st, mid, x, y), query(2 * nod + 1, mid + 1, dr, x, y));
  }
} 

int main(){
  ifstream f("arbint.in");
  ofstream g("arbint.out");

  int n, m;
  f >> n >> m;
  for(int i = 1; i <= n; i++){
    f >> v[i];
  }
  build(1, 1, n);
  for(int i = 1; i <= 2 * n; i++){
    g << arbi[i] << ' ';
  } 
  while(m--){
    int t, x, y;
    f >> t >> x >> y;
    if(t == 0){
      g << query(1, 1, n, x, y) << '\n';
    }
    if(t == 1){
      update(1, 1, n, x, y);
    }
  }

  return 0;
}