Cod sursa(job #179386)

Utilizator firewizardLucian Dobre firewizard Data 15 aprilie 2008 21:00:26
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>
#define max(a,b) (a>b ? a : b )
int n,m,maxi,s,f,t[5000],i,j,poz,a,b,x,val;
void update(int,int,int);
void query(int,int,int);
int main()
{
    freopen ("arbint.in","r",stdin);
    freopen ("arbint.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(i=1;i<=n;i++)
    {scanf("%d",&x);poz=i;val=x;update(1,1,n);}
    for(i=1;i<=m;++i)
    {
     scanf("%d %d %d",&x,&a,&b);
     if(x==0){
              maxi=-1;
              s=a;f=b;
              query(1,1,n);
              printf("%d\n",maxi);
              }
     else{
          poz=a;val=b;
          update(1,1,n);
          }
    }
    return 0;
}
void update(int nod,int l, int r)
{
     if (l==r)
        {
        t[nod]=val;
        return;
        }
     int m=(l+r)/2;
     if(poz<=m)update(2*nod,l,m);
     else update(2*nod+1,m+1,r);
     t[nod]=max(t[2*nod],t[2*nod+1]);
}
void query(int nod,int l,int r)
{
     if (s<=l&&r<=f){
        if(maxi<t[nod])maxi=t[nod];
        return;
        }
     int m=(l+r)/2;
     if(s<=m)query(2*nod,l,m);
     if(m<f)query(2*nod+1,m+1,r);
}