Pagini recente » Cod sursa (job #1141121) | Cod sursa (job #1561895) | Cod sursa (job #2745939) | Cod sursa (job #1196716) | Cod sursa (job #581540)
Cod sursa(job #581540)
#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][10000],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;
for(j=1;(1<<j)<=n;++j)
{
for(i=0;i+(1<<j)-1<n;++i)
{
Min[j][i]=Min[j-1][i];
Min[j][i]=min(Min[j][i],Min[j-1][i+(1<<(j-1))]);
}
}
}
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;
}