Pagini recente » Cod sursa (job #1302623) | Cod sursa (job #1500662) | Cod sursa (job #2730460) | Cod sursa (job #2711326) | Cod sursa (job #2032710)
#include <cstdio>
using namespace std;
FILE *in,*out;
const int nmax = 200000;
const int logmax = 20;
int rmq[1+nmax][logmax];
int lg[logmax];
int n,m;
void precompute()
{
for(int i = 2;i <= n;i ++)
lg[i] = lg[i >> 1] + 1;
}
int min(int a,int b)
{
if(a < b)
return a;
return b;
}
int main()
{
in = fopen("rmq.in","r");
out = fopen("rmq.out","w");
fscanf(in,"%d %d",&n,&m);
precompute();
for(int i = 1;i <= n;i ++)
fscanf(in,"%d",&rmq[0][i]);
for(int i = 1;i <= lg[n];i ++){
for(int j = 1;j <= n;j ++){
rmq[i][j] = min(rmq[i-1][j],rmq[i-1][j + (1 << (i-1))]);
//printf("leng = %d poz = %d rmq = %d\n",i,j,rmq[i][j]);
}
}
for(int i = 1;i <= m;i ++)
{
int x,y;
fscanf(in,"%d %d",&x,&y);
int curr = lg[y-x];
fprintf(out,"%d\n",min(rmq[curr][x],rmq[curr][y - (1 << curr) + 1]));
}
return 0;
}