Pagini recente » Cod sursa (job #1519715) | Cod sursa (job #2370279) | Cod sursa (job #684760) | Cod sursa (job #526432) | Cod sursa (job #2755827)
#include <bits/stdc++.h>
using namespace std;
int arbore[400010];
int n, m, start, finish, val, pos, maxim, x, a, b;
inline int maxxim(int a, int b)
{
if (a > b) return a;
return b;
}
void quer(int nod, int stanga, int dreapta)
{
if(start <= stanga && dreapta <= finish)
{
if(maxim < arbore[nod])
maxim = arbore[nod];
return;
}
int mij = (stanga + dreapta) / 2;
if(start <= mij)
{
quer(2 * nod, stanga, mij);
}
if(mij < finish)
{
quer(2 * nod + 1, mij + 1, dreapta);
}
}
void update(int nod, int stanga, int dreapta)
{
if(stanga == dreapta)
{
arbore[nod] = val;
return;
}
int mij = (stanga + dreapta) / 2;
if(pos <= mij)
{
update(2 * nod, stanga, mij);
}
else
{
update(2 * nod + 1, mij + 1, dreapta);
}
arbore[nod] = maxxim(arbore[2 * nod], arbore[2 * nod + 1]);
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
f >> n >> m;
for(int i = 1; i <= n; i++)
{
f >> x;
pos = i;
val = x;
update(1, 1, n);
}
for(int i = 1; i <= m; i++)
{
f >> x >> a >> b;
if(x == 0)
{
maxim = -1;
start = a, finish = b;
quer(1, 1, n);
g << maxim << '\n';
}
else
{
pos = a, val = b;
update(1, 1, n);
}
}
f.close();
g.close();
return 0;
}