Cod sursa(job #1505113)

Utilizator juniorOvidiu Rosca junior Data 18 octombrie 2015 19:31:23
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>

using namespace std;

#define dim 100001

int N, M, i, X, A, B;
int a[3 * dim];
int start, finish, Val, Pos, maxim;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

void Update(int nod, int l, int r) {
  int m;
  if (l < r) {
    m = (l + r) / 2;
    if (Pos <= m)
      Update(2 * nod, l, m);
    else
      Update(2 * nod + 1, m + 1, r);
    a[nod] = max(a[2 * nod], a[2 * nod + 1]);
  }
  else
    a[nod] = Val;
}

void Query(int nod, int l, int r) {
  int m;
  if (start <= l and r <= finish) { // Maximul intre [l, r] este in a[nod].
    if (maxim < a[nod])
      maxim = a[nod];
    return;
  }
  m = (l + r) / 2;
  if (start <= m)
    Query(2 * nod, l, m);
  if (m < finish)
    Query(2 * nod + 1, m + 1, r);
}

int main() {
  fin >> N >> M;
  for (i = 1; i <= N; i++) {
    fin >> X;
    Pos = i, Val = X;
    Update(1, 1, N);
  }
  for (i = 1; i <= M; i++) {
    fin >> X >> A >> B;
    if (X == 0) {
      maxim = -1; start = A, finish = B;
      Query(1, 1, N);
      fout << maxim << '\n';
    }
    else {
      Pos = A, Val = B;
      Update(1, 1, N);
    }
  }
}