Cod sursa(job #1996025)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 29 iunie 2017 18:39:31
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int arbInt[400000];
int raspuns;
int n, m;

//creez array cu valorile minime din arbore
void actualizare(int pozNod, int st, int dr, int poz, int val) {
  if (st == dr) {
    arbInt[pozNod] = val;
    return ;
  }
  int mij = (st + dr) / 2;
  if (poz <= mij)
    actualizare(2 * pozNod, st, mij, poz, val);
  else
    actualizare(2 * pozNod + 1, mij + 1, dr, poz, val);
  arbInt[pozNod] = max(arbInt[2 * pozNod], arbInt[2 * pozNod + 1]);
}

void intercalare(int pozNod, int st, int dr, int a, int b) {
  if (a <= st && dr <= b) {
    raspuns = max(raspuns, arbInt[pozNod]);
    return ;
  }
  int mij = (st + dr) / 2;
  if (a <= mij)
    intercalare(2 * pozNod, st, mij, a, b);
  if (b > mij)
    intercalare(2 * pozNod + 1, mij + 1, dr, a, b);
}

int main(){
  in >> n >> m;
  for (int i = 1; i <= n; ++i) {
    int temp;
    in >> temp;
    actualizare(1, 1, n, i, temp);
  }
  for (int i = 1; i <= m; ++i) {
    int valid, a, b;
    in >> valid >> a >> b;
    if (valid == 0) {
      raspuns = 0;
      intercalare(1, 1, n, a, b);
      out << raspuns << '\n';
    } else {
      actualizare(1, 1, n, a, b);
    }
  }
  return 0;
}