Cod sursa(job #1877966)

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

int N, M, task, A, B;
int segmentTree[1 << 18], 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", &value);
    position = i;
    Update(0, 0, N-1);
}
for(int i = 0; i < M; i++){
    scanf("%d %d %d", &task, &A, &B);
    if(task == 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;
}