Pagini recente » Cod sursa (job #2875319) | Cod sursa (job #2839407) | Cod sursa (job #2812999) | Cod sursa (job #1896294) | Cod sursa (job #1442870)
#include <bits/stdc++.h>
using namespace std;
const int Nmax = 100000 + 1;
const int NIL = numeric_limits<int>::min();
int T[2 * Nmax];
int N, M;
int join(int a, int b)
{
return max(a, b);
}
void build()
{
for (int i = N - 1; i >= 1; i--)
T[i] = join(T[(i << 1)], T[(i << 1) | 1]);
}
void update(int x, int value)
{
x += N;
T[x] = value;
while (x > 1)
{
T[x >> 1] = join(T[x], T[x ^ 1]);
x >>= 1;
}
}
int query(int x, int y) /// [x, y)
{
x += N;
y += N;
int solX = NIL;
int solY = NIL;
while (x < y)
{
if (x & 1)
{
solX = join(solX, T[x]);
x++;
}
if (y & 1)
{
y--;
solY = join(solY, T[y]);
}
x >>= 1;
y >>= 1;
}
return join(solX, solY);
}
int main()
{
FILE *in = fopen("arbint.in", "r");
FILE *out = fopen("arbint.out", "w");
fscanf(in, "%d %d ", &N, &M);
for (int i = 0; i < N; ++i)
fscanf(in, "%d ", &T[i + N]);
build();
for (int i = 1; i <= M; ++i)
{
int tip, a, b;
fscanf(in, "%d %d %d ", &tip, &a, &b);
a--; b--;
if (tip == 0)
fprintf(out, "%d\n", query(a, b + 1));
else
update(a, b + 1);
}
return 0;
}