Cod sursa(job #2881962)

Utilizator AndreiV03Andrei Voicu AndreiV03 Data 31 martie 2022 01:19:06
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
using namespace std;

#define NMAX 100001

ifstream cin("arbint.in");
ofstream cout("arbint.out");

int n, m;
int tree[4 * NMAX + 66];

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

void query(int node, int left, int right, int start, int finish, int& maxim) {
  if (start <= left && right <= finish) {
    if (tree[node] > maxim)
      maxim = tree[node];
      
    return;
  }
  
  int mid = (left + right) / 2;
  if (start <= mid)
    query(2 * node, left, mid, start, finish, maxim);
  if (mid < finish)
    query(2 * node + 1, mid + 1, right, start, finish, maxim);
}

int main() {
  cin >> n >> m;
  for (int i = 1, x; i <= n; ++i) {
    cin >> x;
    update(1, 1, n, i, x);
  }
  
  for (int i = 1, x, a, b; i <= m; ++i) {
    cin >> x >> a >> b;
    
    if (x == 0) {
      int maxim = -1;
      query(1, 1, n, a, b, maxim);
      cout << maxim << "\n";
    } else update(1, 1, n, a, b);
  }
  cin.close();
  cout.close();
  return 0;
}