Pagini recente » Cod sursa (job #437923) | Cod sursa (job #286796) | Cod sursa (job #436220) | Cod sursa (job #2596016) | Cod sursa (job #650241)
Cod sursa(job #650241)
#include<stdio.h>
#define NMAX 100001
#define LMAX 17
long int v[NMAX], M[LMAX][NMAX],lg[NMAX];
long int min(long a, long b)
{
if(a>b)
return b;
return a;
}
int main()
{
long int n,m,x,y,i,j,aux,sh,dif;
FILE *input,*output;
input=fopen("rmq.in","r");
fscanf(input,"%ld",&n);
fscanf(input,"%ld",&m);
for (i=1;i<=n;i++)
fscanf(input,"%ld ",&v[i]);
for (i=1;i<=n;i++)
M[0][i]=v[i];
for (i=1;(1<<i)<=n;i++)
for (j=1;j<=n-(1<<i)+1;j++)
{
aux=1<<(i-1);
M[i][j]= min(M[i-1][j] , M[i-1][j+aux] );
}
for (i=1; (1 << i) <=n;i++)
{
for (j=1;j<=n-(1<<i)+1;j++)
printf("%ld ", M[i][j]);
printf("\n");
}
lg[1]=0;
for (i=2;i<=n;i++)
lg[i]=lg[i/2]+1;
output=fopen("rmq.out","w");
for (i=1;i<=m;i++)
{
fscanf(input,"%ld %ld",&x,&y);
dif=y-x+1;
aux=lg[dif];
sh=dif-(1<<aux);
fprintf(output,"%ld\n",min(M[aux][x],M[aux][x+sh]));
}
fclose(input);
fclose(output);
return 0;
}