Cod sursa(job #575411)

Utilizator horeste12Stoianovici Horatiu Andrei horeste12 Data 8 aprilie 2011 11:57:17
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<cstdio>
using namespace std;

int n,s[400010],m;

FILE *f;
FILE *g;

int maxx(int x, int y)
{
	if(x>y)
		return x;
	return y;
}

void adaug(int poz, int st, int dr, int i, int nr)
{
	if(st==i&&dr==i)
	{
		s[poz]=nr;
		return ;
	}
	int m=(st+dr)>>1;
	if(st<=i&&i<=m)
		adaug(2*poz,st,m,i,nr);
	if(m<i&&i<=dr)
		adaug(2*poz+1,m+1,dr,i,nr);
	s[poz]=maxx(s[2*poz],s[2*poz+1]);
}

int query(int poz, int st, int dr, int x, int y)
{
	if(y>=dr&&x<=st)
		return s[poz];
	int m=(st+dr)>>1,b=-1,a=-1;
	if(x<=m)
		a=query(2*poz,st,m,x,y);
	if(m<y)
		b=query(2*poz+1,m+1,dr,x,y);
	return maxx(a,b);
}

void solve()
{
	f=fopen("arbint.in","r");
	fscanf(f,"%d %d",&n,&m);
	int el,x,y;
	for(int i=1;i<=n;i++)
	{
		fscanf(f,"%d",&el);
		adaug(1,1,n,i,el);
	}
	for(int i=1;i<=m;i++)
	{
		fscanf(f,"%d %d %d",&el,&x,&y);
		if(!el)
			fprintf(g,"%d\n",query(1,1,n,x,y));
		else
			adaug(1,1,n,x,y);
	}
}
	
int main()
{
	g=fopen("arbint.out","w");
	solve();
	return 0;
}