Pagini recente » Cod sursa (job #1314099) | Cod sursa (job #3145619) | Cod sursa (job #2411866) | Cod sursa (job #3149929) | Cod sursa (job #1651253)
//
// main.cpp
// Arbori de intervale
//
// Created by Daniel Lungu on 05/03/16.
// Copyright © 2016 Daniel Lungu. All rights reserved.
//
#include <iostream>
#include <fstream>
using namespace std;
#define MAX 200000
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);
if ( 2*curent + 1 <= MAX )
{
if(arbore_intervale[ 2 * curent] > arbore_intervale[ 2 * curent + 1])
arbore_intervale[curent] = arbore_intervale[2 * curent];
else
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;
ifstream myinfile("arbint.in");
ofstream myoutfile("arbint.out");
myinfile >> N >> M;
for (int i =1; i <= N; i++)
{
myinfile >> val;
pos = i;
actualizare(1,1,N);
}
for (int i =1; i <= M; i++)
{
myinfile>>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);
myoutfile <<maxim<<endl;
}
}
myinfile.close();
myoutfile.close();
return 0;
}