Cod sursa(job #2765122)

Utilizator TeodorLuchianovTeo Luchianov TeodorLuchianov Data 25 iulie 2021 12:20:48
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>

using namespace std;

int const INF = 1e9 + 7;

int const NMAX = 1e5;
int tree[2 + 2 * NMAX];

void resetTree() {
  for(int i = 1;i <= 2 * NMAX;i++){
    tree[i] = INF;
  }
}

void updateTree(int index, int value) {
  tree[index] = value;
  while(index != 1){
    index /= 2;
    tree[index] = max(tree[index * 2], tree[index * 2 + 1]);
  }
}

int queryMaximum(int from, int to) {
  int ans = max(tree[from], tree[to]);
  while(from <= to){
    if(from % 2 == 1){
      ans = max(tree[from], ans);
      from++;
    }
    from /= 2;
    if(to % 2 == 0){
      ans = max(tree[to], ans);
      to--;
    }
    to /= 2;
  }
  return ans;
}

int main() {

  int n, q, c, cer, index, value, from, to;
  cin >> n >> q;
  resetTree();
  for(int i = 1;i <= n;i++){
    cin >> c;
    updateTree(i - 1 + n, c);
  }
  for(int i = 1;i <= q;i++){
    cin >> cer;
    if(cer == 1){
      cin >> index >> value;
      updateTree(index - 1 + n, value);
    }else{
      cin >> from >> to;
      cout << queryMaximum(from - 1 + n, to - 1 + n) << '\n';
    }
  }
  return 0;
}