Cod sursa(job #1014246)

Utilizator Stefanescu_MihaiStefanescu Mihai-Nicolae Stefanescu_Mihai Data 22 octombrie 2013 13:09:15
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <cstdio>
using namespace std;
int arb[200500];
int maxim(int a,int b)
{
	if (a>b)
		return a;
	return b;
}
int var1,var2,maxint;
void update(int nod, int left, int right)
{
	if (left==right)
		arb[nod]=var2;
	else
	{
		int mid=left+(right-left)/2;
		if (var1<=mid)
			update(nod*2,left,mid);
		else
			update(nod*2+1,mid+1,right);
		arb[nod]=maxim(arb[nod*2],arb[nod*2+1]);
	}
}
void ask(int nod,int left,int right)
{
	if ((left>=var1)&&(right<=var2))
	{
		if (arb[nod]>maxint)
			maxint=arb[nod];
		return;
	}
	int mid=left+(right-left)/2;
	if (mid>=var1)
		ask(nod*2,left,mid);
	if (mid<var2)
		ask(nod*2+1,mid+1,right);
	
}
int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	int n,m,i,c;
	scanf("%d %d\n",&n,&m);
	for (var1=1;var1<n;++var1)
	{
		scanf("%d ",&var2);
		update(1,1,n);
	}
	scanf("%d\n",&var2);
		update(1,1,n);
	for (i=0;i<m;++i)
	{
		scanf("%d %d %d\n",&c,&var1,&var2);
		if (c)
			update(1,1,n);
		else
		{
			maxint=-1;
			ask(1,1,n);
			printf("%d\n",maxint);
		}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}