Pagini recente » Cod sursa (job #2171120) | Cod sursa (job #2429643) | Cod sursa (job #1462140) | Cod sursa (job #2323737) | Cod sursa (job #1190890)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define NX 100010
#define SQRTNX 320
int a[NX], b[SQRTNX], rightPos[SQRTNX], leftPos[SQRTNX];
inline int maxim(int left, int right)
{
int max = a[left];
for (int i = left + 1; i <= right; i++)
{
if (max < a[i])
max = a[i];
}
return max;
}
inline int MaximTwoElems(int a, int b) {
if ( a > b ) return a;
return b;
}
int sqrtMax(int left, int right, int sqrtN, int N)
{
int maxim = -1;
int st = (1<<30), dr=-1;
for ( int i = 1; i <= sqrtN; i++ )
{
if ( left <= leftPos[i] && rightPos[i] <= right )
{
if ( leftPos[i] < st ) st = leftPos[i];
if ( rightPos[i] > dr ) dr = rightPos[i];
maxim = MaximTwoElems(maxim, b[i]);
}
if ( rightPos[i] > right ) break;
}
if ( st == (1<<30) && dr == -1 ) st = dr = right;
for ( int i = left; i <= st; i++ )
maxim = MaximTwoElems(maxim, a[i]);
for ( int i = dr; i <= right; i++ )
maxim = MaximTwoElems(maxim, a[i]);
return maxim;
}
int main()
{
int N, M, op, an, bn, j = 1;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &N, &M);
int sqrtN = 1;
while (sqrtN * sqrtN <= N)
{
sqrtN++;
}
sqrtN--;
int left = 1;
for (int i = 1; i <= N; i++)
{
scanf("%d", &a[i]);
}
for (int i = 1; i <= sqrtN; i++)
{
leftPos[i] = i * sqrtN - sqrtN + 1;
rightPos[i] = i * sqrtN;
b[i] = maxim(leftPos[i], rightPos[i]);
}
for (int i = 1; i <= M; i++)
{
scanf("%d %d %d\n", &op, &an, &bn);
switch (op)
{
case 0:
printf("%d\n", sqrtMax(an, bn, sqrtN, N));
break;
case 1:
a[an] = bn;
int bi = 1, left = 1, right = N;
for (int i = 1; i <= sqrtN; i++)
{
if (an >= leftPos[i] && an <= rightPos[i])
{
bi = i;
left = leftPos[i];
right = rightPos[i];
break;
}
}
b[bi] = maxim(left, right);
break;
}
}
}