Pagini recente » Cod sursa (job #1793336) | Cod sursa (job #1992049) | Cod sursa (job #41144) | Cod sursa (job #1389963) | Cod sursa (job #583516)
Cod sursa(job #583516)
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
#define maxN 100005
#define maxS 350
int a[maxN], v[maxS], sq;
int query (int A, int B)
{
int start = A / sq;
if (A % sq) ++ start;
int end = B / sq;
if (A % sq != 1) ++ start;
int rsp = 0;
if (start > end)
{
for (int i = A; i <= B; ++ i)
rsp = max (rsp, a[i]);
return rsp;
}
for (int i = start; i <= end; ++ i)
rsp = max (v[i], rsp);
for (int i = A; i <= sq * (start - 1); ++ i)
rsp = max (a[i], rsp);
for (int i = sq * end + 1; i <= B; ++ i)
rsp = max (a[i], rsp);
return rsp;
}
void update (int A, int B)
{
int poz = A / sq;
if (A % sq) ++ poz;
a[A] = B;
v[poz] = 0;
for (int i = (poz - 1) * sq + 1; i <= poz * sq; ++ i)
v[poz] = max (v[poz], a[i]);
}
int main()
{
freopen ("arbint.in", "r", stdin);
freopen ("arbint.out", "w", stdout);
int N, M;
scanf ("%d%d", &N, &M);
for (int i = 1; i <= N; ++ i)
scanf ("%d", &a[i]);
sq = (int) sqrt ( (double) N);
int dim = N / sq;
for (int i = 1; i <= dim; ++ i)
for (int j = (i - 1) * sq + 1; j <= i * sq; ++ j)
v[i] = max (v[i], a[j]);
if (sq * dim < N)
{
++ dim;
for (int i = sq * (dim - 1) + 1; i <= N; ++ i)
v[dim] = max (v[dim], a[i]);
}
for (int i = 1; i <= M; ++ i)
{
int type, a, b;
scanf ("%d%d%d", &type, &a, &b);
if (! type) printf ("%d\n", query (a, b));
else update (a, b);
}
return 0;
}