Cod sursa(job #583516)

Utilizator Catah15Catalin Haidau Catah15 Data 20 aprilie 2011 17:34:20
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#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;
}