Pagini recente » Clasamentul arhivei de probleme | Clasamentul arhivei Infoarena Monthly | tema | tema | Cod sursa (job #995567)
Cod sursa(job #995567)
#include <fstream>
#define NMAX 1<<18
using namespace std;
int tree[NMAX];
int n,m;
void insert(int left, int right, int position, int number, int index) {
if (left == right) {
tree[index] = number;
return;
}
int median = (left + right) / 2;
if (position < median) {
insert(left, median, position, number, 2 * index);
} else {
insert(median + 1, right, position, number, 2 * index + 1);
}
if (tree[2 * index] > tree[2 * index + 1]) {
tree[index] = tree[2 * index];
} else {
tree[index] = tree[2 * index + 1];
}
}
inline int max(int a, int b) {
if (a > b) return a;
return b;
}
int query(int left, int right, int qleft, int qright, int index) {
if (qleft <= left && qright >= right)
return tree[index];
int median = (left + right) / 2;
int left_son = 0;
int right_son = 0;
if (qleft <= median)
left_son = query(left, median, qleft, qright, 2 * index);
if (qright > median)
right_son = query(median + 1, qleft, qright, 2 * index + 1);
return max(left_son, right_son);
}
int main() {
ifstream in("arbint.in");
ofstream out("arbint.out");
in>>n>>m;
int a, b, c;
for (int i = 1; i <= n; i++) {
in>>a;
insert(1, n, i, a, 1);
}
for (int i = 1; i <= m; i++) {
in>>a>>b>>c;
if (!a) {
out<<query(1, n, b, c, 1)<<"\n";
} else {
insert(1, n, b, c, 1);
}
}
return 0;
}