Pagini recente » Cod sursa (job #735812) | Cod sursa (job #521675) | Cod sursa (job #1139708) | Cod sursa (job #82121) | Cod sursa (job #1515791)
#include <stdio.h>
int v[100001];
int a[18][100001];///a[i][j]=costul minim pt secventa care incepe la j si are lg 2^i
int n,m;
int lg[100001];
int min(int a, int b)
{
if (a < b)
return a;
else
return b;
}
void construct()
{
int i,j;
for (i=0; i<n; i++)
a[0][i]=v[i];
for (i=1; (1 << i) <n; i++)
for (j=0; j + (1 << i) <= n; j++)
a[i][j]=min(a[i-1][j],a[i-1][j+ (1 << (i-1))]);
}
void precalc()
{
int i;
lg[1]=0;
for (i=2; i<=n; i++)
lg[i]=lg[i/2]+1;
}
int main()
{
FILE *f,*f2;
int i,x,y,aux,ans;
f=fopen("rmq.in","r");
f2=fopen("rmq.out","w");
fscanf(f,"%d%d",&n,&m);
for (i=0; i<n; i++)
fscanf(f,"%d",&v[i]);
construct();
precalc();
for (i=1; i<=m; i++)
{
fscanf(f,"%d%d",&x,&y);
aux=lg[y-x+1];
ans=min(a[aux][x-1],a[aux][y-(1 << aux)]);
fprintf(f2,"%d\n",ans);
}
fclose(f);
fclose(f2);
}