Cod sursa(job #288912)

Utilizator alisssiaMititelu Andra alisssia Data 26 martie 2009 10:54:24
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
using namespace std;
#include<cstdio>
#define dim 100001

int H[4*dim+66],n,m,a,b,val,poz,max;
int maxim (int q,int w) {if(q>w) return q; return w;}

void update(int nod,int st,int dr)
{
    int mij;
    if(st==dr)	{ H[nod]=val;return;}

	mij=(st+dr)/2;
	if(poz<=mij) update(nod*2,st,mij);
	else update(nod*2+1,mij+1,dr);
	H[nod]=maxim(H[nod*2],H[nod*2+1]);
    
}

void query(int nod,int st,int dr)
{
    int mij;
    if(a<=st && dr<=b) 
    {
	if(max<H[nod]) max=H[nod];
	return;
    }
    else
    {
	mij=(st+dr)/2;
	if(a<=mij) query(nod*2,st,mij);
	if(mij<b) query(nod*2+1,mij+1,dr);
    }
}

int main()
{   
    int i,x,y,k;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m); 
    for(i=1;i<=n;i++)
    {
	scanf("%d",&x);
	val=x;
	poz=i;
	update(1,1,n);
    }
    for(i=1;i<=m;i++)
    {
	scanf("%d%d%d",&k,&x,&y); 
	if(k) 
	{
	    val=y;
	    poz=x;
	    update(1,1,n);
	}
	else
	{
	    a=x;b=y;max=-1;
	    query(1,1,n);
	    printf("%d\n",max);

	}
    }
    return 0;
}