Cod sursa(job #1190890)

Utilizator ariel_roAriel Chelsau ariel_ro Data 25 mai 2014 21:02:34
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#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;
		}
	}
}