Pagini recente » Cod sursa (job #51554) | Cod sursa (job #997139) | Cod sursa (job #396454) | Cod sursa (job #1802193) | Cod sursa (job #625322)
Cod sursa(job #625322)
#include <fstream>
#include <vector>
using namespace std;
int vect_arb[2000967];
int query_st, query_dr, maxim;
int update_pos, update_val;
void update(int, int, int);
void query(int, int, int);
int main(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, maxim = 0;
query(1, 1, n);
fout << maxim << '\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
}
void query(int nod, int a, int b) {
if(query_st <= a && b <= query_dr) { // inclus in intervalul de interogare
maxim = max(maxim, vect_arb[nod]);
return;
}
int mij = (a + b) / 2;
if(query_st <= mij) query(nod*2, a, mij);
if(query_dr > mij) query(nod*2 + 1, mij+1, b);
}