Cod sursa(job #2455259)

Utilizator urweakurweak urweak Data 11 septembrie 2019 09:13:04
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>
#define dim 100001
using namespace std;
 
int MaxArb[4*dim], N, M;
int Pos, Val, start, finish, maxim = -1;
 
inline int Max(int a, int b){
  if(a > b) return a;
  return b;
}
 
void Update(int nod, int left, int right){
  if(left == right){
   MaxArb[nod] = Val;
   return;
  }
  
  int div = (left + right) / 2;
  if(Pos <= div) Update(2 * nod, left, div);
  else Update(2 * nod + 1, div + 1, right);
 
  MaxArb[nod] = Max(MaxArb[2 * nod], MaxArb[2 * nod + 1]);
}
 
void Query(int nod, int left, int right){
 if(start <= left && right <= finish){
  if(maxim < MaxArb[nod]) maxim = MaxArb[nod];
  return;
 }
 int div = (left + right) / 2;
 if(start <= div) Query(2 * nod, left, div);
 if(div < finish) Query(2 * nod + 1, div + 1, right);
}
 
int main(){
   ifstream in("arbint.in");
   ofstream out("arbint.out");
   cin >> N >> M;
   
   for(int i = 1; i<=N; i++){
     int x;
     cin >> x;
     Val = x, Pos = i;
     Update(1, 1, N);
   }
   
   for(int i = 1; i<=M; i++){
    int c, a, b;
    cin >> c >> a >> b;
    if(c == 0){ // finds the Maximum
      maxim = -1;
      start = a, finish = b;
      Query(1, 1, N);
      out << maxim <<"\n"; 
    }
    else{ // replace the value on pos A With the value B
      Pos = a;
      Val = b;
      Update(1, 1, N);
    }
   }
  return 0;
}