Pagini recente » Cod sursa (job #3134430) | Cod sursa (job #461526) | Cod sursa (job #1125975) | Cod sursa (job #2498985) | Cod sursa (job #613476)
Cod sursa(job #613476)
#include <fstream>
#include <vector>
using namespace std;
vector <int> vect_arb(1660967);
int query_st, query_dr;
int update_pos, update_val;
void update(int, int, int);
int query(int, int, int);
void solve(void);
int main(void) {
solve();
}
void solve(void) {
int n, m;
ifstream fin("arbint.in");
fin >> n >> m;
int val;
for(int i = 1; i <= n; ++i) {
fin >> val;
update_pos = i; update_val = val;
update(1, 1, n);
}
int op, a, b;
ofstream fout("arbint.out");
for(int i = 1; i <= m; ++i) {
fin >> op >> a >> b;
if(op == 0) {
query_st = a, query_dr = b;
fout << query(1, 1, n) << '\n';
}
else {
update_pos = a, update_val = b;
update(1, 1, n);
}
}
fout.close();
fin.close();
}
void update(int nod, int a, int b) {
if(a == b) {
vect_arb[nod] = update_val;
return;
}
int mij = (a + b) / 2;
if(update_pos <= mij) update(nod*2, a, mij);
else update(nod*2 + 1, mij+1, b);
vect_arb[nod] = max(vect_arb[nod*2], vect_arb[nod*2 + 1]); // actualizarea parintilor ultima
}
int query(int nod, int a, int b) {
if(query_st <= a && b <= query_dr) // inclus in intervalul de interogare
return vect_arb[nod];
int mij = (a + b) / 2, maxim = 0;
if(query_st <= mij) maxim = max(maxim, query(nod*2, a, mij));
if(query_dr > mij) maxim = max(maxim, query(nod*2 + 1, mij+1, b));
return maxim;
}