Pagini recente » Cod sursa (job #2798029) | Cod sursa (job #320071) | Cod sursa (job #2473993) | Cod sursa (job #1042489) | Cod sursa (job #581508)
Cod sursa(job #581508)
#include <cstdio>
#include <cmath>
#include <stdlib.h>
#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[NMax],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[j]=(int*)realloc(Min[j],(log2(n-j)+1)*sizeof(int));
for(j=0;j<n;++j) Min[j][0]=A[j];
}
void Procesare()
{
int i,j;
for(j=1;(1<<j)<=n;++j)
{
for(i=0;i+(1<<j)-1<n;++i)
{
Min[i][j]=Min[i][j-1];
Min[i][j]=min(Min[i][j],Min[i+(1<<(j-1))][j-1]);
}
}
}
int Query(int a,int b)
{
int min,k;
k=log2(b-a);
if(Min[a][k]<Min[b-(1<<k)+1][k]) min=Min[a][k];
else min=Min[b-(1<<k)+1][k];
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()
{
int a,b;
Citire();
Procesare();
Raspunsuri();
return 0;
}