Pagini recente » Cod sursa (job #2371471) | Cod sursa (job #532862) | Cod sursa (job #1143852) | Cod sursa (job #2456713) | Cod sursa (job #2901031)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fcin("arbint.in");
ofstream fcout("arbint.out");
int arb[200000]; // 200000 <= 2*N-1
int n, m, i, a, b, x, op, poz;
// n - nr elemente
// m - nr operatii
// cod 0 - max[a, b]
// cod 1 - a = b
void update(int nod, int st, int dr);
int query(int nod, int st, int dr);
int main()
{
fcin>>n>>m;
for(int i=1; i<=n; i++)
{
fcin>>x; // citim el
poz = i; // actualizam arborele de la st = 1 la dr = n
update(1, 1, n);
}
for(int i=1; i<=m; i++)
{
fcin>>op>>a>>b;
if(op == 0)
cout<< query(1, 1, n) << '\n';
else {
poz = a;
x = b;
update(1, 1, n);
}
}
return 0;
}
void update(int nod, int st, int dr)
{
int mij;
if(st >= poz && dr <= poz) { // daca poz este valid
arb[nod] = x; // se modifica nodul
return;
}
mij = (st+dr) / 2; // stabilim mijlocul intervalului
if( poz<=mij )
update(nod*2, st, mij); // actualizare fiu stanga
else
update(nod*2+1, mij+1, dr); // actualizare fiu dreapta
arb[nod] = max(arb[nod*2+1], arb[nod*2]); // modificarea nodului
}
int query(int nod, int st, int dr)
{
int mij, x1=0, x2=0;
if(a<=st && dr<=b) // verficam daca intervalul [st, dr] este inclus in [a, b]
return arb[nod];
mij = (st+dr)/2;
if(a<=mij)
x1 = query(nod*2, st, mij); // fiu stanga
if(b>mij)
x2 = query(nod*2+1, mij+1, dr); // fiu dreapta
if(x2>x1)
x1 = x2;
return x1;
}