Cod sursa(job #521669)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 13 ianuarie 2011 08:38:10
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 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;x=poz;
	for (;x<=n ; x+= x&-x)
		if (aib[x]==poz)
		{
			y=querry(x-x&-x+1,x-1);
			if (a[poz]<a[y])
				aib[x]=y;
		}
		else
			if (a[aib[x]]<a[poz])
				aib[x]=poz;
}

int main()
{
	int i,x,y,m,op;
	ifstream f("arbint.in");
	ofstream g("arbint.out");
	f>>n>>m;
	
	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<<querry (x,y)<<"\n";
		else 
		{
			a[x]=y;
			update(x);
		}
	}
	f.close();
	g.close();
	return 0;
}