Pagini recente » Cod sursa (job #1342622) | Cod sursa (job #1238502) | Cod sursa (job #2544090) | Cod sursa (job #46748) | Cod sursa (job #1651257)
//
// main.cpp
// Arbori de intervale
//
// Created by Daniel Lungu on 05/03/16.
// Copyright © 2016 Daniel Lungu. All rights reserved.
//
#include <cstdio>
#define MAX 400000
int arbore_intervale[MAX];
int pos, val;
int inceput, final;
int maxim;
void actualizare (int curent, int st, int dr)
{
if ( st == dr )
{
arbore_intervale[curent] = val;
return;
}
int mij = (st + dr) / 2;
if (pos <= mij) actualizare(2*curent, st, mij);
else actualizare(2*curent + 1 , mij + 1, dr);
arbore_intervale[curent] = arbore_intervale[ 2 * curent] > arbore_intervale[ 2 * curent + 1] ? arbore_intervale[curent] = arbore_intervale[2 * curent] : arbore_intervale[curent] = arbore_intervale[2 * curent + 1];
}
void interogare (int curent, int st, int dr)
{
if ( inceput <= st && dr <= final )
{
if ( maxim < arbore_intervale[curent] ) maxim = arbore_intervale[curent];
return;
}
int div = (st+dr)/2;
if ( inceput <= div ) interogare(2*curent,st,div);
if ( div < final ) interogare(2*curent+1,div+1,dr);
}
int main(int argc, const char * argv[]) {
int M,N,x,a,b;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &N, &M);
for (int i =1; i <= N; i++)
{
scanf("%d", &val);
pos = i;
actualizare(1,1,N);
}
for (int i =1; i <= M; i++)
{
scanf("%d %d %d", &x, &a, &b);
if ( x == 1){
pos = a;
val = b;
actualizare(1,1,N);
}else{
maxim = -1;
inceput = a;
final = b;
interogare(1,1,N);
printf("%d\n", maxim);
}
}
return 0;
}