Cod sursa(job #2058438)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 5 noiembrie 2017 17:25:38
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int const nmax = 100000;

int arb[4 * nmax + 1];

void update(int node) { //indice in cadrul arborelui de intervale
  if(0 < node) {
    arb[node] = max(arb[node * 2], arb[node * 2 + 1]);
    update(node / 2);
  }
}

int query(int from, int to) { //programezi stabil, inclusiv pentru cazul from > to
  int answer = 0; //0 e element neutru la operatia de maxim
  if(from == to)
    answer = arb[from];
  else if(from < to) {
    if(from % 2 == 1) {
      answer = max(answer, arb[from]);
      from++;
    }
    if(to % 2 == 0) {
      answer = max(answer, arb[to]);
      to--;
    }
    answer = max(answer, query(from / 2, to / 2));
  }
  return answer;
}

int main() {
  int n, m;
  in >> n >> m;

  int k = 0;
  while((1 << k) < n){
    k++;
  }
  int ni = (1 << k) - 1;//numarul de noduri interne din arborele de intervale

  //se citesc n numere de la tastatura, pune-le in frunzele arborelui de intervale
  for(int i = 1 ; i <= n ;i++){
    in >> arb[ni + i]; //pe aceasta frunza ai updatat-o deja aici
    update((ni + i) / 2); //update direct de parinte. Care e parintele? Vezi desenul I
  }
  for(int i=1; i<= m; i++) {
    int op, x, y;
    in >> op >> x >> y;
    if(op == 0){
      out << query(ni + x , ni + y)<<'\n';
    } else{
      arb[ni + x] = y;
      update((ni + x) / 2);
    }
  }
  return 0;
}