Cod sursa(job #1631432)

Utilizator pickleVictor Andrei pickle Data 5 martie 2016 16:02:20
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
const int Nmax = 100555;

int A[4*Nmax];
int N, M;
int first, last, pos, val, mx, x, a, b;

int max(int x, int y) { return x > y ? x : y; }
void update(int nod, int l, int r);
void query(int nod, int l, int r);

int main() {
  ifstream fin ("arbint.in");
  ofstream fout ("arbint.out");
  fin >> N >> M;

  for(int i = 1; i <= N; ++i) {
    fin >> x;

    pos = i; val = x;
    update(1, 1, N);
  }

  while(M--) {
    fin >> x >> a >> b;
    if (x == 0) {
      first = a, last = b, mx = -1;
      query(1, 1, N);
      fout << mx << '\n';
    } else if (x == 1) {
      pos = a, val = b;
      update(1, 1, N);
    }
  }

  return 0;
}

void update(int nod, int l, int r) {
  if (l == r) { // l == r == pos
    A[nod] = val;
    return;
  }

  int m = (l + r)/2;
  if (pos <= m)     update(2*nod, l, m);
  else if (pos > m) update(2*nod + 1, m+1, r);

  A[nod] = max(A[2*nod], A[2*nod+1]);
}

void query(int nod, int l, int r) {
  if (first <= l && r <= last) {
    mx = max(mx, A[nod]);
    return;
  }

  int m = (l + r)/2;
  if (first <= m) query(2*nod, l, m);
  if (last > m)  query(2*nod+1, m+1, r);
}