Pagini recente » Cod sursa (job #127039) | Cod sursa (job #1758217) | Cod sursa (job #2602455) | Cod sursa (job #1009983) | Cod sursa (job #1097646)
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
struct seg {
int left, right;
};
struct nod{
seg interval;
int maxim;
};
int n, m, i, a, b, k, poz[100001], aux, rez;
nod v[262144];
void split(seg x, int nodul) {
seg stanga, dreapta;
int mij = (x.left + x.right) / 2;
stanga.left = x.left;
stanga.right = mij;
dreapta.left = mij + 1;
dreapta.right = x.right;
v[nodul*2].interval = stanga;
v[nodul*2 + 1].interval = dreapta;
if(stanga.left != stanga.right) {
split(stanga, nodul*2);
}
else {
poz[stanga.left] = nodul*2;
}
if(dreapta.left != dreapta.right) {
split(dreapta, nodul*2 + 1);
}
else {
poz[dreapta.left] = nodul*2 + 1;
}
}
void infuz(int nodul, int val) {
v[nodul].maxim = val;
if(nodul > 1) {
if(val > v[nodul/2].maxim) {
infuz(nodul/2, val);
}
}
}
void ask(int y) {
nod x = v[y];
if((a <= x.interval.left) && (b >= x.interval.right)) {
if(x.maxim > rez) {
rez = x.maxim;
}
}
else {
int mij = (x.interval.left + x.interval.right) / 2;
if(a <= mij) {
ask(y * 2);
}
if(b > mij) {
ask(y * 2 + 1);
}
}
}
int main() {
fin >> n >> m;
v[1].interval = seg{1, n};
split(v[1].interval, 1);
for(i = 1; i <= n; i++) {
fin >> aux;
infuz(poz[i], aux);
}
for(i = 0; i < m; i++) {
fin >> k >> a >> b;
if(k == 0) {
rez = 0;
ask(1);
fout << rez << '\n';
}
if(k == 1) {
infuz(poz[a], b);
}
}
fin.close();
fout.close();
return 0;
}