Pagini recente » Cod sursa (job #2291845) | Cod sursa (job #574037) | Cod sursa (job #948543) | Rating Ignat Matei (immatei) | Cod sursa (job #162507)
Cod sursa(job #162507)
#include <stdio.h>
#include <math.h>
int m[100001][100001],a[100001],n,k,i,j,l,r,x,y;
void rmq(int m[100001][100001], int a[100001], int n)
{
int i, j;
//initialize M for the intervals with length 1
for (i = 0; i < n; i++)
m[i][0] = i;
//compute values from smaller to bigger intervals
for (j = 1; 1 << j <= n; j++)
for (i = 0; i + (1 << j) - 1 < n; i++)
if (a[m[i][j - 1]] < a[m[i + (1 << (j - 1))][j - 1]])
m[i][j] = m[i][j - 1];
else
m[i][j] = m[i + (1 << (j - 1))][j - 1];
}
int main()
{FILE *fin,*fout;
fin=fopen("rmq.in","r");
fout=fopen("rmq.out","w");
fscanf(fin,"%d %d",&n,&k);
for (i=0;i<n;i++)
fscanf(fin,"%d",&a[i]);
rmq(m,a,n);
for (l=1;l<=k;l++)
{fscanf(fin,"%d %d",&x,&y);
x--;
y--;
r=(int)(log(y-x+1));
if (a[m[x][r]]<=a[m[y-(int)pow(2,r)+1][r]]) fprintf(fout,"%d\n",a[m[x][r]]);
else fprintf(fout,"%d\n",a[m[y-(int)pow(2,r)+1][r]]);
}
fclose(fin);
fclose(fout);
return 0;
}