Cod sursa(job #156803)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 12 martie 2008 19:08:31
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
//arbore de intervale
# include <stdio.h>

# define nmax 1000001
# define FIN "arbint.in"
# define FOUT "arbint.out"

long m,n,i,a,b,c,H[4*nmax],x,rez;

long max(long a, long b)
{
 if (a>b) return a;
     else return b;
}

void update(long c,long x,long y,long poz,long val)
{
 long 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(long c,long li,long lf)
{
 long 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("%ld %ld",&n,&m);
 for (i=1; i<=n; i++)
   {
    scanf("%ld",&x);
    update(1,1,n,i,x);
   }
 for (i=1; i<=m; i++)
   {
    scanf("%ld %ld %ld",&c,&a,&b);
    if (c==0) 
      {
       rez=0;
       query(1,1,n);
       printf("%ld\n",rez);
      }
    else update(1,1,n,a,b);
   }
 return 0;
}