Pagini recente » Cod sursa (job #2735385) | Cod sursa (job #1585118) | Cod sursa (job #1582351) | Cod sursa (job #1564941) | Cod sursa (job #247398)
Cod sursa(job #247398)
#include <stdio.h>
int A[100000][17],p[17],lg[100000];
int main()
{
FILE *in = fopen("rmq.in","r");
FILE *out = fopen("rmq.out","w");
int n,m,i,j,put,x;
fscanf(in,"%d%d",&n,&m);
for (i=1;i<=n;i++) fscanf(in,"%d",&A[i][0]);
put = 0;
lg[1] = 0;
p[0] = 1;
x = 1;
for (i=1;i<=100000;i++)
{
if (2*x<=i) {
x = 2*x;
p[++put] = x;
}
lg[i] = put;
}
for (i=n;i;i--)
{
j=1;
while (i+p[j]<=n+1) {
if (A[i][j-1]<A[i+p[j-1]][j-1]) A[i][j] = A[i][j-1];
else A[i][j] = A[i+p[j-1]][j-1];
j++;
}
}
int y,k;
for (;m;m--)
{
fscanf(in,"%d%d",&x,&y);
k = lg[y-x+1];
if (A[x][k]<A[y-p[k]+1][k]) fprintf(out,"%d\n",A[x][k]);
else fprintf(out,"%d\n",A[y-p[k]+1][k]);
}
fclose(in);fclose(out);
}