Cod sursa(job #301121)

Utilizator HaggisRanca Razvan Haggis Data 7 aprilie 2009 22:34:12
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
#include<set>

using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
struct {int st; int dr; int val;}p[250001];
int a[100001],x,n,m,i,y,t,q1,q2,b;


void creare(int nod,int q, int n)
{
	p[nod].st=q;
	p[nod].dr=n;
	
	if(q!=n)
	{
		int mij=(q+n)/2;
		creare(nod*2,q,mij);
		creare(nod*2+1,mij+1,n);
	}
}

void modifica(int i1, int nod, int mod)
{
	if(p[nod].st>=i1 && p[nod].dr<=i1)
		{
			p[nod].val=mod;
			y=nod;
		}
	else
	{
		int mij=(p[nod].st+p[nod].dr)/2;
		if(mij>=i1)
			modifica(i1, 2*nod, mod);
		else if(mij<i1)
			modifica(i1, 2*nod+1, mod);
	}
}

void maximizeaza(int y)
{
	if(p[y/2].val!=max(p[(y/2)*2].val,p[((y/2)*2)+1].val) && (y/2))
		{
			p[y/2].val=max(p[(y/2)*2].val,p[((y/2)*2)+1].val);
			maximizeaza(y/2);
		}
}

void cauta(int q1, int q2, int nod, set<int> &pi)
{
	if(p[nod].st>=q1 && p[nod].dr<=q2)
		{
			pi.insert(p[nod].val);
			
		}
	else
	{
		int mij=(p[nod].st+p[nod].dr)/2;
		if(mij>=q1)
			cauta(q1,q2, 2*nod,pi);
		else if(mij<q2)
			cauta(q1,q2, 2*nod+1,pi);
		pi.insert(max(p[2*nod].val,p[2*nod+1].val));
	}

}
int main ()
{
	set<int> pi;
	in>>n>>m;
	creare(1,1,n);
	for(i=1;i<=n;i++)
		{
			
			in>>a[i];
			modifica(i,1,a[i]);
			maximizeaza(y);
		}
	for(i=1;i<=m;i++)
	{
		in>>t>>q1>>q2;
		b=0;
		if(t==0)
		{
			pi.clear();
			cauta(q1,q2,1,pi);
			out<<*pi.begin()<<"\n";
		}
		else
		{
			
			modifica(q1,1,q2);
			maximizeaza(y);
		}
	}
		
	return 0;
}