Cod sursa(job #2690487)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 24 decembrie 2020 11:04:01
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int NMAX = 100000;

int n, m;
int aint[2 * NMAX + 5];

void build() {
  for(int i = n - 1; i; i--)
    aint[i] = max(aint[2 * i], aint[2 * i + 1]);
}

void update(int poz, int val) {
  aint[poz += n - 1] = val;
  for(poz /= 2; poz; poz /= 2)
    aint[poz] = max(aint[2 * poz], aint[2 * poz + 1]);
}

int query(int st, int dr) {
  int ans = -1;
  for(st += n - 1, dr += n - 1; st <= dr; st /= 2, dr /= 2) {
    if(st % 2 == 1)
      ans = max(ans, aint[st++]);
    if(dr % 2 == 0)
      ans = max(ans, aint[dr--]);
  }
  return ans;
}

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

  scanf("%d %d", &n, &m);
  for(int i = 0; i < n; i++)
    scanf("%d", &aint[n + i]);

  build();

  for(int i = 1; i <= m; i++) {
    int tip, a, b;
    scanf("%d %d %d", &tip, &a, &b);

    if(!tip)
      printf("%d\n", query(a, b));
    else
      update(a, b);
  }

  return 0;
}