Cod sursa(job #555426)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 15 martie 2011 14:47:13
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<cstdio>
using namespace std;

int n,m,i,pos,val,maxim,c,a,b,arb[4*100010+66];

void read(),solve(),upd(int,int,int),query(int,int,int);

int main()
{
	read();
	solve();
	
	return 0;
}

void read()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{
		pos=i;scanf("%d",&val);
		upd(1,1,n);
	}
}

void solve()
{
	for(;m;m--)
	{
		scanf("%d%d%d",&c,&a,&b);
		if(c==0)
		{
			maxim=-1;
			query(1,1,n);
			printf("%d\n",maxim);
			continue;
		}
		pos=a;val=b;
		upd(1,1,n);
	}
}

void upd(int nod,int st,int dr)
{
	if(st==dr)
	{
		arb[nod]=val;
		return;
	}
	int mid=(st+dr)/2;
	if(pos<=mid)upd(nod*2,st,mid);
	else        upd(nod*2+1,mid+1,dr);
	if(arb[nod*2+1]>arb[nod*2])arb[nod]=arb[nod*2+1];
	else                       arb[nod]=arb[nod*2];
}

void query(int nod,int st,int dr)
{
	if(a<=st && dr<=b)
	{
		maxim=maxim<arb[nod]?arb[nod]:maxim;
		return ;
	}
	int mid=(st+dr)/2;
	if(a<=mid)query(nod*2,st,mid);
	if(mid<b)  query(nod*2+1,mid+1,dr);
}