Cod sursa(job #331783)

Utilizator IoannaPandele Ioana Ioanna Data 15 iulie 2009 12:39:00
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<stdio.h>
#define mmax 100005
#define nmax 200010
long n,a,b,o,m;
long v[mmax],poz[mmax],t[nmax];

void read()
{
scanf("%ld%ld",&n,&m);
long i;
for (i=1;i<=n;i++)
     scanf("%ld",&v[i]);
}

void constr(long k,long st,long dr)
{
long mij;
if (st==dr)
   {
    t[k]=v[st];
    poz[st]=k;
    return;
   }
mij=(st+dr)/2;
constr(2*k,st,mij);
constr(2*k+1,mij+1,dr);
if (t[2*k]>t[2*k+1])
    t[k]=t[2*k];
else t[k]=t[2*k+1];
}

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

long interv(long k,long st,long dr,long a,long b)
{
long mij,fs=0,fd=0;
if (a<=st && b>=dr)
    return t[k];
mij=(st+dr)/2;
if (a<=mij)
    fs=interv(2*k,st,mij,a,b);
if (b>mij)
    fd=interv(2*k+1,mij+1,dr,a,b);
return max(fs,fd);
}

void update(long k)
{
if (k==0)
    return;
t[k]=max(t[2*k],t[2*k+1]);
update (k/2);
}

int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
read();
constr(1,1,n);
long i;
for (i=1;i<=m;i++)
     {
      scanf("%ld%ld%ld",&o,&a,&b);
      if (!o)
         {
          printf("%ld\n",interv(1,1,n,a,b));
         }
      else {
            v[a]=b;
            t[poz[a]]=b;
            update(poz[a]/2);
           }
     }
return 0;
}