Cod sursa(job #1043301)

Utilizator hellol30FMI Macovei Daniel hellol30 Data 28 noiembrie 2013 12:54:04
Problema Arbori de intervale Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<cstdio>
using namespace std;
int n,m,x,y,op,k;
int arb[1000];
void push(int,int,int,int,int);
void maxi(int,int,int,int,int);
int main()
{
	freopen("arbint.in","rt",stdin);
	freopen("arbint.out","wt",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&x);
		push(1,1,n,x,i);
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&op,&x,&y);
		if(op)
		{
			push(1,1,n,y,x);
		}
		else
		{
			k = 0;
			maxi(1,1,n,x,y);
			printf("%d\n",k);
		}
	}
	return 0;
}
void push(int nod, int s, int d, int ss,int dd)
{
	if( s==d ) 
	{
		arb[nod]=ss;
		return ;
	}
	int m=(s+d)/2;
	if(dd <= m) push(2*nod, s ,m ,ss ,dd);
	  else push(2*nod+1,m+1,d,ss,dd);
	arb[nod]=(arb[2*nod] < arb[2*nod+1]) ? arb[2*nod+1]: arb[2*nod];
}
void maxi(int nod, int s, int d, int ss, int dd)
{
	if( ss <= s && d<=dd)
	{
		k = (arb[nod] > k) ? arb[nod] : k ;
		return ;
	}
	int m=(s+d)/2;
	if(ss<=m) maxi(2*nod, s ,m,ss,dd);
	if(m<dd) maxi(2*nod+1, m+1, d, ss,dd);
}