Pagini recente » Cod sursa (job #2510073) | Cod sursa (job #412527) | Cod sursa (job #511249) | Cod sursa (job #2850950) | Cod sursa (job #1424126)
#include <iostream>
#include <fstream>
#define I(x) ((x)&-(x))
using namespace std;
const int INF = 100000888;
const int Nmax = 100555;
int N, M;
int v[Nmax];
int A[Nmax];
int max(int x, int y) { return x > y ? x : y; }
int Query(int l, int h) {
int p, m = 0, q = 0;
while (h >= l) {
p = h - I(h);
if (p+1 >= l) {
q = A[h];
h = p;
} else {
q = h;
h--;
}
if (v[m] < v[q])
m = q;
}
return m;
}
void Update(int pos, int val) {
v[pos] = val;
int p = pos;
while (p <= N) {
if (A[p] == pos) {
int q = Query(p - I(p) + 1, p-1);
A[p] = v[q] > v[p] ? q : p;
} else if (v[A[p]] < val) {
A[p] = pos;
}
p += I(p);
}
}
int main()
{
ifstream f ("arbint.in");
ofstream g ("arbint.out");
int x, a, b;
v[0] = -INF;
f >> N >> M;
for (int i = 1; i <= N; i++) {
f >> a;
Update(i, a);
}
while (M--) {
f >> x >> a >> b;
if (x == 1)
Update(a, b);
else if (x == 0)
g << v[Query(a, b)] << '\n';
}
return 0;
}