Pagini recente » Cod sursa (job #656245) | Cod sursa (job #2266202) | Cod sursa (job #990893) | Cod sursa (job #99790) | Cod sursa (job #625314)
Cod sursa(job #625314)
#include <fstream>
#include <vector>
using namespace std;
int vect_arb[1660967];
int query_st, query_dr;
int update_pos, update_val;
void update(const int&, const int&, const int&);
int query(const int&, const int&, const 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;
fout << query(1, 1, n) << '\n';
}
else {
update_pos = a, update_val = b;
update(1, 1, n);
}
}
fout.close();
fin.close();
}
void update(const int& nod, const int& a, const 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(const int& nod, const int& a, const 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;
}