Cod sursa(job #1452858)

Utilizator theprdvtheprdv theprdv Data 22 iunie 2015 01:40:12
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <stdio.h>
#include <fstream>
using namespace std;

#define in "arbint.in"
#define out "arbint.out"
#define dim 100001

inline int Maxim(int a, int b) {
	if (a > b) return a;
	return b;
}

int N, M, X, Y, tip, size, K;
int Arb[dim], A[dim];
int St[dim], Dr[dim];

void Update();
int Query();

int main()
{
	freopen(in, "r", stdin);
	freopen(out, "w", stdout);

	scanf("%d%d", &N, &M);
	for (int i = 1; i <= N; i++)
		scanf("%d", &A[i]);

	size = 0;
	while (size*size <= N) size++;
	size--;

	K = N / size + 1;

	for (int i = 1; i*size <= N; i++)
	{
		Arb[i] = -1;
		St[i] = size*(i - 1) + 1, Dr[i] = size*i;
		for (int nod = St[i]; nod <= Dr[i]; nod++)
			Arb[i] = Maxim(Arb[i], A[nod]);
	}

	for (; M; M--)
	{
		scanf("%d%d%d", &tip, &X, &Y);

		if (tip) Update();
		else       printf("%d\n", Query());
	}
}

void Update()
{
	A[X] = Y;
	for (int i = 1; i*size <= N; i++)
		if (X >= size*(i - 1) + 1 && X <= size*i)
		{
			Arb[i] = -1;
			for (int nod = size*(i - 1) + 1; nod <= size*i; nod++)
				Arb[i] = Maxim(Arb[i], A[nod]);

			break;
		}
}

int Query()
{
	int maxim = -1;
	int st = (1 << 30), dr = -1;

	for (int i = 1; i <= K; i++)
	{
		if (X <= St[i] && Dr[i] <= Y)
		{
			if (St[i] < st)  st = St[i];
			if (Dr[i] > dr)  dr = Dr[i];
			maxim = Maxim(maxim, Arb[i]);
		}
		if (Dr[i] > Y) break;
	}

	if (st == (1 << 30) && dr == -1) st = dr = Y;

	for (int i = X; i <= st; i++)
		maxim = Maxim(maxim, A[i]);

	for (int i = dr; i <= Y; i++)
		maxim = Maxim(maxim, A[i]);

	return maxim;
}