Cod sursa(job #521683)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 13 ianuarie 2011 09:14:46
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include<fstream.h>

int aib[100005],a[100006],n;

int  querry (int l, int r )
{
	int x,y=0;
	
	while (l<=r)
	{
		x=r-(r&(-r));
		if (x<l)
		{
			x=r-1;
			if (a[y]<a[r])
				y=r;
		}
		else
			if (a[y]<a[aib[r]])
				y=aib[r];
		r=x;
	}
	return y;
}

void update (int poz)
{
	int x,y,z;x=poz;y=poz;
	for (;x<=n ; x+= (x&(-x)))
		if (aib[x]==y)
		{
			z=querry(x-(x&(-x))+1,x-1);
			if (a[x]<a[z])
				aib[x]=z;
			else
				aib[x]=x;
		}
		else
			if (a[aib[x]]<a[y])
				aib[x]=y;
}

int main()
{
	int i,x,y,m,op;
	ifstream f("arbint.in");
	ofstream g("arbint.out");
	f>>n>>m;
	//aib[0]=-1;
	for (i=1;i<=n;i++)
	{
		f>>a[i];
		update (i);
	}
	
	for (i=1;i<=m;i++)
	{
		f>>op>>x>>y;
		if (op==0)
			g<<a[querry (x,y)]<<"\n";
		else 
		{
			a[x]=y;
			update(x);
		}
	}
	f.close();
	g.close();
	return 0;
}