Cod sursa(job #2576597)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 6 martie 2020 20:49:35
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int MAX_N = 100000;

int segTree[5 + 4 * MAX_N];

void update(int pos, int val, int node, int lft, int rght) {
  if (lft == rght)
    segTree[node] = val;
  else {
    int mid;
    mid = (lft + rght) >> 1;
    if (pos <= mid)
      update(pos, val, 2 * node, lft, mid);
    else
      update(pos, val, 2 * node + 1, mid + 1, rght);
    segTree[node] = max(segTree[2 * node], segTree[2 * node + 1]);
  }
}

int query(int qLeft, int qRight, int node, int lft, int rght) {
  if (qLeft <= lft && rght <= qRight)
    return segTree[node];

  int mid, q1, q2;
  mid = (lft + rght) >> 1;
  q1 = q2 = 0;
  if (qLeft <= mid)
    q1 = query(qLeft, qRight, 2 * node, lft, mid);
  if (qRight > mid)
    q2 = query(qLeft, qRight, 2 * node + 1, mid + 1, rght);

  return max(q1, q2);
}

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++) {
    int x;
    scanf("%d", &x);
    update(i, x, 1, 1, n);
  }

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

  return 0;
}