Cod sursa(job #1121525)

Utilizator andrici_cezarAndrici Cezar andrici_cezar Data 25 februarie 2014 13:07:03
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int A[400066], 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)>>1;

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

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

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

  int mid = (left+right)>>1;
  if ( a <= mid ) {
    query(nod<<1, left, mid, a, b);
  } 
  if ( mid < b ) {
    query((nod<<1)+1, mid+1, right, a, b);
  }
}

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;
}