Cod sursa(job #354072)

Utilizator andreii_93andrei ion andreii_93 Data 6 octombrie 2009 23:07:46
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<stdio.h>

int graf[280000],v[100001],n,m,i,x,y,op;

void construire(int st,int dr,int poz)
{
	if(st==dr)
	{
		v[st]=poz;
		return;
	}
	int mij=(st+dr)/2;
	construire(st,mij,2*poz);
	construire(mij+1,dr,(2*poz)+1);
}

int max(int a,int b)
{
	if(a>b) return a;
	return b;
}

void inserare(int nr,int poz)
{
	graf[v[poz]]=nr;
	for(int i=v[poz]/2;i>0;i/=2)
		graf[i]=max(graf[2*i],graf[(2*i)+1]);
}

int max_graf(int st,int dr, int poz)
{
	if(st>=x&&dr<=y)
		return graf[poz];
	else if(dr<x||st>y) return 0;
	int mij=(st+dr)/2;
	//return max(max_graf(st,mij,2*poz),max_garf(mij+1,dr,2*poz+1));
	if(max_graf(st,mij,poz*2)<max_graf(mij+1,dr,poz*2+1)) return max_graf(mij+1,dr,poz*2+1);
	else return max_graf(st,mij,poz*2);
}

int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d",&n);
	scanf("%d",&m);
	construire(1,n,1);
	for(i=1;i<=n;++i)
	{
		scanf("%d",&x);
		inserare(x,i);
	}
	for(i=1;i<=m;++i)
	{
		scanf("%d%d%d",&op,&x,&y);
		if(op==0)
			printf("%d\n",max_graf(1,n,1));
		else inserare(y,x);
	}
	return 0;
}