Cod sursa(job #1877790)

Utilizator 1475369147896537415369Andrei Udriste 1475369147896537415369 Data 13 februarie 2017 18:47:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <cstdio>
#include <algorithm>
using namespace std;

int N, M, X, A, B;
int segmentTree[262144], value;
int start, finish, position, maxim;

void Update(int node, int low, int high){
     if(low == high){
          segmentTree[node] = value;
          return;
     }
     int middle = low + (high - low) / 2;

     if(position <= middle) Update(2 * node + 1, low, middle);
     else Update(2 * node + 2,middle + 1, high);

     segmentTree[node] = max(segmentTree[2 * node + 1], segmentTree[2 * node + 2]);
}
void Query(int node, int low, int high){
     if(start <= low && high <= finish){
          if(maxim < segmentTree[node]) maxim = segmentTree[node];
          return;
     }
     int middle = low + (high - low) / 2;

     if(start <= middle) Query(2 * node + 1, low, middle);
     if(middle < finish) Query(2 * node + 2, middle + 1 , high);
}

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", &X);
    position = i, value = X;
    Update(0,0,N-1);
}
for(int i=0; i<M; i++){
    scanf("%d %d %d", &X, &A, &B);
    if(X == 0){
        maxim = -1;
        start = A - 1 , finish = B - 1 ;
        Query(0,0,N-1);
        printf("%d\n", maxim);
    }else{
        position = A - 1, value = B;
        Update(0,0,N-1);
    }
}
return 0;
}