Cod sursa(job #215776)

Utilizator vladianavladiana micu vladiana Data 20 octombrie 2008 22:26:34
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
# include <stdio.h>

# define nmax 100001
# define FIN "arbint.in"
# define FOUT "arbint.out"
# define max(a,b) (a>b?a:b)

int m,n,i,a,b,c,x,rez;
int H[2*nmax];

    void update(int c,int x,int y,int poz,int val)
    {
        int mij;
        
        if (x==y) H[c]=val;
      else
        {
           mij=(x+y)>> 1;
           if (poz<=mij) update(c << 1,x,mij,poz,val);
           else update(c << 1 | 1,mij+1,y,poz,val);
           
           H[c]=max(H[c << 1],H[c << 1 | 1]);
        }
    }

    void query(int c,int li,int lf)
    {
        int mij;
 
        if (a<=li && lf<=b)
        {
           rez=max(H[c],rez);
           return;
        }
        
        mij=(li+lf) >> 1;
        if (a<=mij) query(c << 1,li,mij);
        if (b>mij) query(c << 1 | 1,mij+1,lf);
    }

    int main()
    {
        freopen(FIN,"r",stdin);
        freopen(FOUT,"w",stdout);
        
        scanf("%d %d",&n,&m);
        
        for (i=1; i<=n; i++)
        {
           scanf("%d",&x);
           update(1,1,n,i,x);
        }
        
        for (i=1; i<=m; i++)
        {
            scanf("%d %d %d",&c,&a,&b);
            if (c==0) 
            {
               rez=0;
               query(1,1,n);
               printf("%d\n",rez);
            }
            else update(1,1,n,a,b);
        }
        return 0;
    }