Cod sursa(job #278487)

Utilizator FllorynMitu Florin Danut Flloryn Data 12 martie 2009 12:46:32
Problema Arbori de intervale Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 1.66 kb
  #include<stdio.h>  
    long int n,m,baza,i,a[262150],b[262150],s[262150],last,fs,fd,x,y,z,poz,tata,  
    maxold,maxnew;  
    long int query(long int pa);  
    int main()  
    {  
        FILE *f,*g;  
       f=fopen("arbint.in","r");  
        g=fopen("arbint.out","w");  
       fscanf(f,"%ld%ld",&n,&m);  
       baza=1;  
       while(baza<n)baza<<=1;  
       baza--;  
       i=1;  
       for(i=1;i<=n;i++)  
       { a[baza+i]=i;  
         b[baza+i]=i;  
         fscanf(f,"%ld",&s[baza+i]);  
       }  
       for(i=n+1;i<=baza+1;i++)  
       { a[baza+i]=i;  
         b[baza+i]=i;  
       }  
       for(i=baza;i>=1;i--)  
       { fs=(i<<1);  
         fd=fs+1;  
         a[i]=a[fs];  
         b[i]=b[fd];  
         s[i]=(s[fs]>s[fd])?s[fs]:s[fd];  
       }  
       for(i=1;i<=m;i++)  
       { fscanf(f,"%ld%ld%ld",&x,&y,&z);  
         if(x==0)  
          fprintf(g,"%ld\n",query(1));  
         else  
         {  poz=baza+y;  
            s[poz]=z;  
            tata=poz>>1;  
            while(tata)  
             { fs=tata<<1;  
           fd=fs+1;  
           maxold=s[tata];  
           maxnew=(s[fs]>s[fd])?s[fs]:s[fd];  
           if(maxnew==maxold)break;  
           s[tata]=maxnew;  
           tata>>=1;  
             }  
         }  
       }  
       fcloseall();  
       return 0;  
   }  
   long int query(long int pa)  
   {       long int max1,max2;  
       if(y>b[pa])return 0;  
       if(z<a[pa])return 0;  
       if(y<=a[pa]&&b[pa]<=z) return s[pa];  
       max1=query(pa<<1);  
       max2=query((pa<<1)|1);  
       max1=(max1>max2)?max1:max2;  
       return max1;  
  }