Cod sursa(job #772242)

Utilizator geniuanduOncescu Andreea geniuandu Data 28 iulie 2012 19:43:32
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<cstdio>
#include<cstring>
using namespace std;
int m,a,b,i,x,vi,n,arb[300002];
char s[1100001];
int max(int a,int b)
{
	if(a>b)
		return a;
	else
		return b;
}
void update(int nod,int st,int dr,int poz,int val)
{
	if(st == dr)
	{
		arb[nod]=val;
		return ;
	}
	int mij=(st+dr)/2;
	if(mij>=poz)
		update(nod*2,st,mij,poz,val);
	else
		update(nod*2+1,mij+1,dr,poz,val);
	arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}
int query(int nod,int st,int dr,int x,int y)
{
	if(st >= x && y >= dr)
		return arb[nod];
	int mij=(st + dr) / 2,val = 0;
	if(x <= mij)
		val = query(nod * 2, st,mij,x,y);
	if(y > mij)
		val = max(val,query(nod * 2 + 1,mij + 1,dr,x,y));
	return val;
}
int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d %d\n",&n,&m);
	gets(s);
	int nr=0,nrnr=0;
	i=0;
	while(s[i]!='\n')
	{
		if(s[i]!=' ')
		{
			nr=nr*10+s[i]-48;
		}
		else
		{
			nrnr++;
			update(1,1,n,nrnr,nr);
			nr=0;
		}
		i++;
	}
	nrnr++;
	update(1,1,n,nrnr,nr);
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d",&x,&a,&b);
		if(x==0)
			printf("%d\n",query(1,1,n,a,b));
		else
			update(1,1,n,a,b);
	}
	return 0;
}