Pagini recente » Cod sursa (job #2609722) | Cod sursa (job #1104981) | Cod sursa (job #591002) | Cod sursa (job #796161) | Cod sursa (job #1097762)
/* Calcularea maximului pe intervale folosind arbori de intervale */
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX 100001
int N, M, A[4 * MAX], X, Y, S, Oper;
void Update(int Nod, int Left, int Right)
{
if (Left == Right)
{
A[Nod] = Y;
return;
}
int Middle = (Left + Right) / 2;
if (X <= Middle)
{
Update(2 * Nod, Left, Middle);
}
else
{
Update(2 * Nod + 1, Middle + 1, Right);
}
A[Nod] = max(A[2 * Nod], A[2 * Nod + 1]);
}
void Query(int Nod, int Left, int Right)
{
if (X <= Left && Right <= Y)
{
S = max(S, A[Nod]);
return;
}
int Middle = (Left + Right) / 2;
if (X <= Middle)
{
Query(2 * Nod, Left, Middle);
}
if (Y > Middle)
{
Query(2 * Nod + 1, Middle + 1, Right);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d", &N, &M);
for (int i = 1; i <= N; i++)
{
scanf("%d", &Y);
X = i;
Update(1, 1, N);
}
for (int i = 1; i <= M; i++)
{
scanf("%d %d %d", &Oper, &X, &Y);
if (Oper == 1)
{
Update(1, 1, N);
}
else
{
S = 0;
Query(1, 1, N);
printf("%d\n", S);
}
}
}