Cod sursa(job #300858)

Utilizator adrianraduleaRadulea Adrian adrianradulea Data 7 aprilie 2009 18:54:07
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<stdio.h>
FILE *f,*g;
long i,n,lim1[265000],lim2[265000],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)
{ max=-1; for(j=lim1[nod];j<=lim2[nod];j++) if(a[j]>max&&j!=x) max=a[j];
  if(x>=lim1[nod]&&x<=lim2[nod]) if(y>max) maxim[nod]=y; else maxim[nod]=max;
  mij=(lim1[nod]+lim2[nod])/2;
  if(x>mij) update(2*nod+1,x,y); else if(lim1[nod]!=lim2[nod]) update(2*nod,x,y);
}
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 { xa=x; ya=y; update(1,x,y); a[xa]=ya; }
   }
  fclose(g);
  return 0;
}