Cod sursa(job #2482932)

Utilizator vladisimovlad coneschi vladisimo Data 29 octombrie 2019 08:37:22
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <algorithm>
#include <cstdio>

const int MAX_N = 100000;

int tree[2 + 4 * MAX_N];
int a[2 + MAX_N];

void update(int nod, int left, int right, int pos, int value) {
  if (left == right) {
    tree[nod] = value;
    return;
  }
  int mid = (left + right) / 2;
  if (pos <= mid)
    update(2 * nod, left, mid, pos, value);
  else
    update(2 * nod + 1, mid + 1, right, pos, value);
  tree[nod] = std::max(tree[2 * nod], tree[2 * nod + 1]);
}

int query(int nod, int left, int right, int leftQ, int rightQ) {
  if (left == leftQ && rightQ == right)
    return tree[nod];
  int mid = (left + right) / 2;
  if (rightQ <= mid)
    return query(2 * nod, left, mid, leftQ, rightQ);
  else if (mid < leftQ)
    return query(2 * nod + 1, mid + 1, right, leftQ, rightQ);
  return std::max(query(2 * nod, left, mid, leftQ, mid), query(2 * nod + 1, mid + 1, right, mid + 1, rightQ));
}

int main() {
  freopen("arbint.in", "r", stdin);
  freopen("arbint.out", "w", stdout);
  int n, q;
  scanf("%d%d", &n, &q);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    update(1, 1, n, i, a[i]);
  }
  for (int i = 1; i <= q; i++) {
    int type, a, b;
    scanf("%d%d%d", &type, &a, &b);
    if (type == 1)
      update(1, 1, n, a, b);
    else
      printf("%d\n", query(1, 1, n, a, b));
  }
  return 0;
}