Pagini recente » Cod sursa (job #2468584) | Cod sursa (job #169774) | Cod sursa (job #2426394) | Cod sursa (job #994387) | Cod sursa (job #2755201)
#include <bits/stdc++.h>
using namespace std;
// tutorial bun care explica segment trees (au legatura): https://www.youtube.com/watch?v=ZBHKZF5w4YU
int arbore[400'100];
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 o("arbint.out");
f >> n >> m;
for(int i = 1; i <= n; i++){
f >> x;
pos = i;
val = x;
// cout << x << endl;
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);
o << maxim << '\n';
}
else{
pos = a, val = b;
update(1, 1, n);
}
}
return 0;
}