Cod sursa(job #1123522)

Utilizator andrici_cezarAndrici Cezar andrici_cezar Data 26 februarie 2014 08:56:21
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int N, T, x, o, a, b, maxim;
int A[400066];

void update(int nod, int left, int right, int val, int pos) {
  if (left == right) {
    A[nod] = val;
    return;
  }

  int mid = (left + right)>>1;

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

  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) {
    if ( maxim < A[nod] ) maxim = A[nod];
    return;
  }

  int mid = (left+right)>>1;
  if (a <= mid) {
    query(nod<<1, left, mid, a, b);
  }
  if (b > mid) {
    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, &T);

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

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

  return 0;
}