Cod sursa(job #1799818)

Utilizator tudorcomanTudor Coman tudorcoman Data 6 noiembrie 2016 20:33:16
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb

#include <cstdio>
#include <algorithm>

using namespace std;

const int maxN = 131072;
int arb[maxN << 1];
int v[maxN];

void build(int nod, int st, int dr) {
  if(st == dr)
    arb[nod] = v[st];
  else {
    int mid = (st + dr) >> 1, k = nod << 1;
    build(k, st, mid);
    build(k + 1, mid + 1, dr);
    arb[nod] = max(arb[k], arb[k + 1]);
  }
}

void update(int nod, int val, int pos, int st, int dr) {
  if(st == dr)
    arb[nod] = val;
  else {
    int mid = (st + dr) >> 1, k = nod << 1;
    if(pos <= mid)
      update(k, val, pos, st, mid);
    else
      update(k + 1, val, pos, mid + 1, dr);
    arb[nod] = max(arb[k], arb[k + 1]);
  }
}

int query(int nod, int x, int y, int st, int dr) {
  if(x <= st and dr <= y)
    return arb[nod];
  else {
    int mid = (st + dr) >> 1, k = nod << 1;
    int ans = 0;
    if(x <= mid)
      ans = max(ans, query(k, x, y, st, mid));
    if(y > mid)
      ans = max(ans, query(k + 1, x, y, mid + 1, dr));
    return ans;
  }
}

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

  int N, M;
  scanf("%d %d", &N, &M);
  for(int i = 1; i <= N; ++ i)
    scanf("%d", &v[i]);

  int p;
  for(p = 1; p < N; p <<= 1);
  build(1, 1, p);

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

  return 0;
}