Cod sursa(job #300972)

Utilizator adrianraduleaRadulea Adrian adrianradulea Data 7 aprilie 2009 20:27:30
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<stdio.h>
FILE *f,*g;
long i,n,lim1[265000],lim2[265000],dgb,m,mij,max,j,a[100000],aux,maxim[265000],op,x,y,xa,ya;
void init()
{ for(i=1;i<=2*n+1;i++)
   if(lim1[i]!=lim2[i])
    { mij=(lim1[i]+lim2[i])/2;
      max=-1; for(j=lim1[i];j<=mij;j++) if(a[j]>max) max=a[j]; maxim[2*i]=max; lim1[2*i]=lim1[i]; lim2[2*i]=mij;
      max=-1; for(j=mij+1;j<=lim2[i];j++) if(a[j]>max) max=a[j]; maxim[2*i+1]=max; lim1[2*i+1]=mij+1; lim2[2*i+1]=lim2[i];
    }
}
long maxx(long a,long b) { if(a>b) return a; return b; }
long querry(long nod,long x,long y)
{ long mij=(lim1[nod]+lim2[nod])/2; if(x>y) return 0;
  else if(x==lim1[nod]&&y==lim2[nod]) return maxim[nod];
  else if(x>lim2[nod]||y<lim1[nod]) return 0;
  else
   { if(x<=mij&&y<=mij) return querry(2*nod,x,y);
     else if(x>mij) return querry(2*nod+1,x,y);
     else if(x<=mij&&y>mij) return maxx(querry(2*nod,x,mij),querry(2*nod+1,mij+1,y));
   }
  return 0;
}
void update(long nod,long x,long y)
{ if(lim1[nod]==lim2[nod]&&lim1[nod]==x) maxim[nod]=y;
  else if(x>=lim1[nod]&&x<=lim2[nod])
   { long mij=(lim1[nod]+lim2[nod])/2;
     if(x<=mij) { update(2*nod,x,y); maxim[nod]=maxx(maxim[2*nod+1],maxim[2*nod]); }
     if(x>mij) { update(2*nod+1,x,y); maxim[nod]=maxx(maxim[2*nod],maxim[2*nod+1]);}
   }
}
int main()
{ f=fopen("arbint.in","r"); g=fopen("arbint.out","w");
  fscanf(f,"%ld%ld",&n,&m);
  for(i=1;i<=n;i++) fscanf(f,"%ld",&a[i]); max=-1;
  lim1[1]=1; lim2[1]=n; max=-1; for(i=1;i<=n;i++) if(a[i]>max) max=a[i]; maxim[1]=max;
  init();
  for(i=1;i<=m;i++)
   { fscanf(f,"%ld%ld%ld",&op,&x,&y);
     if(op==0)
      { aux=querry(1,x,y); fprintf(g,"%ld\n",aux); }
      else { update(1,x,y); a[x]=y; }
   }
  fclose(g);
  return 0;
}