Pagini recente » Cod sursa (job #2446257) | Cod sursa (job #2094511) | Cod sursa (job #1980909) | Cod sursa (job #2759440) | Cod sursa (job #581548)
Cod sursa(job #581548)
#include <cstdio>
#include <cmath>
#define NMax 100000
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
using namespace std;
FILE *fin=fopen("rmq.in","r"),*fout=fopen("rmq.out","w");
int A[NMax],Min[18][100000],n,m;
void Citire()
{
int i,j;
fscanf(fin,"%d%d",&n,&m);
for(i=0;i<n;++i)
fscanf(fin,"%d",&A[i]);
for(j=0;j<n;++j) Min[0][j]=A[j];
}
void Procesare()
{
int i,j,l1,l2;
for(j=1;(1<<j)<=n;++j)
{
l1=(i<<(j-1));
l2=i<<j;
for(i=0;i+l2-1<n;++i)
{
Min[j][i]=Min[j-1][i];
Min[j][i]=min(Min[j][i],Min[j-1][i+l1]);
}
}
}
int Query(int a,int b)
{
int min,k;
k=(int)log2(b-a);
if(Min[k][a]<Min[k][b-(1<<k)+1]) min=Min[k][a];
else min=Min[k][b-(1<<k)+1];
return min;
}
void Raspunsuri()
{
int a,b;
while(m--)
{
fscanf(fin,"%d %d",&a,&b);
fprintf(fout,"%d\n",Query(min(a,b)-1,max(a,b)-1));
}
}
int main()
{
Citire();
Procesare();
Raspunsuri();
return 0;
}