Cod sursa(job #210319)

Utilizator katakunaCazacu Alexandru katakuna Data 27 septembrie 2008 12:33:25
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<stdio.h>

int max,t,p,u,val,poz,n,m,i,a[100011];

int Max(int a,int b){
  if(a>b)
  return a;

return b;
}

void update(int nod,int st,int dr){
int mij;

    if(st==dr){
    a[nod]=val;
    return;
    }

    mij=(st+dr)/2;

    if(poz<=mij)
    update(nod<<1, st, mij);

    else
    update( (nod<<1)+1, mij+1, dr );
    
    a[nod]=Max(a[nod<<1],a[(nod<<1)+1]);

}

void query(int nod,int st,int dr){
int mij;

     if(p<=st&&dr<=u){
     max=Max(max,a[nod]);
     return;
     }

  mij=(st+dr)/2;

     if(p <= mij)
     query(nod<<1 , st, mij);

     if(u > mij)
     query( (nod<<1) +1, mij+1, dr);

}


int main(){


FILE *f=fopen("arbint.in","r");
FILE *g=fopen("arbint.out","w");

fscanf(f,"%d %d",&n,&m);

   for(i=1;i<=n;i++){
   fscanf(f,"%d",&val);
   poz=i;
   update(1,1,n);
   }

   for(i=1;i<=m;i++){
   fscanf(f,"%d",&t);

      if(!t){
      fscanf(f,"%d %d",&p,&u);
      max=-1;
      query(1,1,n);
        fprintf(g,"%d\n",max);
      }

      if(t){
      fscanf(f,"%d %d",&poz,&val);
      update(1,1,n);
      }
   
   }

fclose(f);
fclose(g);

return 0;
}