Cod sursa(job #575430)

Utilizator horeste12Stoianovici Horatiu Andrei horeste12 Data 8 aprilie 2011 12:07:29
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include<cstdio>
using namespace std;

int n,s[400010],m,i,nr;
int el,x,y;

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

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

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

int main()
{
	g=fopen("arbint.out","w");
	solve();
	return 0;
}