Cod sursa(job #354074)

Utilizator andreii_93andrei ion andreii_93 Data 6 octombrie 2009 23:11:31
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 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 maxim(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(maxim(st,mij,2*poz), maxim(mij+1,dr,2*poz+1));
}

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",maxim(1,n,1));
		else inserare(y,x);
	}
	return 0;
}