Cod sursa(job #658465)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 8 ianuarie 2012 21:28:03
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <stdio.h>
#define inf 1999999999
#define p2 500000
#define nmax 100001

int arb[p2],nr[nmax],a,b,maxim,val,k,n,m;

inline int max(int q,int z)
{
if(q>z)return q;
    else return z;
return 0;
}

void actualizare(int nod,int st,int dr)
{ int mij;
if(st==dr){
            arb[nod]=val;
            return;
            }
    else
        {
        mij=(st+dr)/2;
        if(k<=mij)actualizare(2*nod,st,mij);
        else actualizare(2*nod+1,mij+1,dr);
        arb[nod]=max(arb[2*nod],arb[2*nod+1]);
        }
}

void interogare(int nod,int st,int dr)
{ int mij;
if(a<=st&&dr<=b){
                if(arb[nod]>maxim)maxim=arb[nod];
                }
    else{
        mij=(st+dr)/2;
        if(a<=mij)interogare(2*nod,st,mij);
        if(mij<b)interogare(2*nod+1,mij+1,dr);
        }
}

void citire()
{ int i,op;
freopen("arbint.in","r",stdin);
scanf("%d %d\n",&n,&m);
for(i=1;i<=n;++i)
    {
    scanf("%d ",&nr[i]);
    k=i; val=nr[i];
    actualizare(1,1,n);
    }
for(i=1;i<=m;++i)
    {
    scanf("%d %d %d\n",&op,&a,&b);
    if(op==0){
            maxim=-inf;
            interogare(1,1,n);
            printf("%d\n",maxim);
           }
        else
            {
            k=a; val=b;
            actualizare(1,1,n);
            }
    }
}

int main()
{
freopen("arbint.out","w",stdout);
citire();
fclose(stdout);
return 0;
}