Cod sursa(job #349670)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 21 septembrie 2009 09:01:24
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<stdio.h>
#define DIM 100005

int v[3*DIM],maxim;
int max (int x,int y)
{
    if(x<y)
        return y;
    return x;
}
void arbint (int st,int dr,int x,int val,int k)
{
    int mij=(st+dr)/2;
    if(st==dr)
        v[k]=val;
    else
    {
        if(k<=mij)
			arbint(st,mij,x,val,2*k);
		else
			arbint(mij+1,dr,x,val,2*k+1);
		v[k]=max(v[2*k],v[2*k+1]);
    }
}
void query (int x,int y,int st,int dr,int k)
{
    if(st>=x && dr<=y)
    {		
        if (v[k]>maxim)
		  maxim=v[k];
    }
    else
    {
        int mij=(st+dr)/2;
		if (x<=mij)
			query(x,y,st,mij,2*k);
		if (y>mij)
			query(x,y,mij+1,dr,2*k+1);
    }
}
int main ()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int i,q,x,y,n,m,a;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
    {
		scanf("%d",&a);
        arbint(1,n,i,a,1);
    }
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&q,&x,&y);
        if(q==0)
        {
            maxim=-1;
            query(x,y,1,n,1);
            printf("%d\n",maxim);
        }
        else
            arbint(1,n,x,y,1);
    }
    return 0;
}