Cod sursa(job #1475445)

Utilizator salam1Florin Salam salam1 Data 24 august 2015 07:18:12
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int LMAX = (1LL << 18);
const int INF = 0x3f3f3f3f;
int n, m;
int A[LMAX];

void update(int left, int right, int node, int pos, int val) {
  if (left == right) {
    A[node] = val;
    return ;
  }
  int mid = (left + right) / 2;
  if (pos <= mid)
    update(left, mid, node * 2, pos, val);
  else
    update(mid + 1, right, node * 2 + 1, pos, val);
  A[node] = max(A[node * 2], A[node * 2 + 1]);
}

int query(int left, int right, int node, int a, int b) {
  if (b < left || right < a) {
    return -INF;
  }
  if (a <= left && right <= b) {
    return A[node];
  }
  int mid = (left + right) / 2;
  return max(query(left, mid, node * 2, a, b), query(mid + 1, right, node * 2 + 1, a, b));
}

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

void solve() {
  int type, a, b;
  while (m--) {
    scanf("%d%d%d", &type, &a, &b);
    switch (type) {
      case 0: {
        printf("%d\n", query(1, n, 1, a, b));
        break;
      }
      case 1: {
        update(1, n, 1, a, b);
        break ;
      }
    }
  }
}

int main() {
  freopen("arbint.in", "r", stdin);
  freopen("arbint.out", "w", stdout);
  
  read();
  solve();
  return 0;
}