Mai intai trebuie sa te autentifici.
Cod sursa(job #178946)
Utilizator | Data | 15 aprilie 2008 13:25:17 | |
---|---|---|---|
Problema | Range minimum query | Scor | 60 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 0.81 kb |
#include<stdio.h>
#include<math.h>
FILE *f1,*f2;
int v[100111],ma[100100][20];
long p[20]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536};
long a,b,c,n,m,i,j,l;
int main(){
f1=fopen("rmq.in","r");
f2=fopen("rmq.out","w");
fscanf(f1,"%ld%ld",&n,&m);
for(i=1;i<=n;fscanf(f1,"%d",&v[i]),i++);
for(i=0;i<=n;ma[i][0]=v[i],i++);
for(i=n;i>0;i--){
a=1;
for(j=1;i+a<=n+1&&j<=n;j++){
//a=pow(2,j-1);
a=1<<(j-1);
ma[i][j]=ma[i+a][j-1];
if(ma[i][j-1]<ma[i+a][j-1]){
ma[i][j]=ma[i][j-1];
}
}
}
for(i=1;i<=m;i++){
fscanf(f1,"%ld%ld",&a,&b);
l=0;
c=b-a+1;
while(p[l]<=c){
l++;
}
l--;
c=ma[a][l];
if(ma[a][l]>ma[b-p[l]+1][l]){
c=ma[b-p[l]+1][l];
}
fprintf(f2,"%ld\n",c);
// min([x,y])=min(a[x][L],a[y-2^L+1][L])
}
return 0;
}