Pagini recente » Borderou de evaluare (job #2686534) | Borderou de evaluare (job #2247294) | Cod sursa (job #2166452) | Borderou de evaluare (job #2015896) | Cod sursa (job #3232708)
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
#define max_dim 100001
int numar_elemente, numar_interogari;
int ArboreMax[4*max_dim+66];
int stanga, dreapta, valoare, pozitie, val_maxima;
int CalculeazaMaxim(int primul, int al_doilea) {
return primul > al_doilea ? primul : al_doilea;
}
void Actualizeaza(int nod, int capat_stanga, int capat_dreapta){
if (capat_stanga == capat_dreapta)
{
ArboreMax[nod] = valoare;
return;
}
int mijloc = (capat_stanga+capat_dreapta)/2;
if (pozitie <= mijloc){
Actualizeaza(2*nod, capat_stanga, mijloc);
} else {
Actualizeaza(2*nod+1, mijloc+1, capat_dreapta);
}
ArboreMax[nod] = CalculeazaMaxim(ArboreMax[2*nod], ArboreMax[2*nod+1]);
}
void Interogare(int nod, int capat_stanga, int capat_dreapta){
if (stanga <= capat_stanga && capat_dreapta <= dreapta)
{
if (val_maxima < ArboreMax[nod]) val_maxima = ArboreMax[nod];
return;
}
int mijloc = (capat_stanga+capat_dreapta)/2;
if (stanga <= mijloc){
Interogare(2*nod, capat_stanga, mijloc);
}
if (mijloc < dreapta){
Interogare(2*nod+1, mijloc+1, capat_dreapta);
}
}
int main(){
int val, capat_stanga, capat_dreapta;
f>>numar_elemente>>numar_interogari;
for (int i = 1; i <= numar_elemente; i++)
{
f>>val;
pozitie = i, valoare = val;
Actualizeaza(1,1,numar_elemente);
}
for (int j = 1; j <= numar_interogari; j++)
{
f>>val>>capat_stanga>>capat_dreapta;
if (val == 0)
{
val_maxima = -1;
stanga = capat_stanga, dreapta = capat_dreapta;
Interogare(1,1,numar_elemente);
g<<val_maxima<<"\n";
}
else
{
pozitie = capat_stanga, valoare = capat_dreapta;
Actualizeaza(1,1,numar_elemente);
}
}
}