Cod sursa(job #1121360)

Utilizator andrici_cezarAndrici Cezar andrici_cezar Data 25 februarie 2014 12:37:37
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int A[2000001], N, M, x, maxim;
int o, a, b;
void update(int nod, int left, int right, int pos, int val) {
  if (left == right) {
    A[nod] = val;
    return;
  }

  int mid = (left+right)/2;

  if (pos <= mid) {
    update(2*nod,    left,   mid, pos, val);
  } else {
    update(2*nod+1, mid+1, right, pos, val);
  }

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

void query(int nod, int left, int right, int start, int finish) {
  if (start <= left && right <= finish) {
    if (maxim < A[nod]) maxim = A[nod];
    return;
  }

  int mid = (left+right)/2;
  if ( start <= mid ) {
    query(2*nod, left, mid, start, finish);
  } else if ( mid < finish ) {
    query(2*nod+1, mid+1, right, start, finish);
  }
}

int main() {
  freopen("arbint.in", "r", stdin);
  freopen("arbint.out", "w", stdout);

  scanf("%d %d", &N, &M);

  for (int i = 1; i <= N; ++i) {
    scanf("%d", &x);
    update(1, 1, N, i, x);
  }

  for (int i = 1; i <= M; ++i) {
    scanf("%d %d %d", &o, &a, &b);
    if ( o == 0 ) {
      maxim = -1;
      query(1, 1, N, a, b);
      printf("%d\n", maxim);
    } else {
      update(1, 1, N, a, b);
    }
  }

  return 0;
}