Pagini recente » Cod sursa (job #1701796) | Cod sursa (job #899765) | Cod sursa (job #1861801) | Cod sursa (job #2554802) | Cod sursa (job #2403911)
#include <cstdio>
#include <cmath>
#define NMAX 100005
#define NMAX2 18
using namespace std;
FILE *fin=fopen("rmq.in","r");
FILE *fout=fopen("rmq.out","w");
int rmq[NMAX][NMAX2];
int a[NMAX];
int n, m;
int l, r;
int l2(int x)
{
int ans = 0;
int act = 1;
if (x<=1)
return 0;
while (1)
{
if (act > x)
return ans-1;
++ans, act*=2;
}
}
int main()
{
fscanf(fin,"%d %d",&n,&m);
for (int i=1;i<=n;++i)
{
fscanf(fin,"%d",&a[i]);
}
for (int i=1;i<=n;++i)
{
rmq[i][0] = i;
}
for (int j=1;(1<<j)<=n;++j)
{
for (int i=1;i + (1<<j) -1 <=n; ++i)
{
if (a[rmq[i][j-1]] <= a[rmq[i+(1<<(j-1))][j-1]])
{
rmq[i][j] = rmq[i][j-1];
}
else
{
rmq[i][j] = rmq[i+(1<<(j-1))][j-1];
}
}
}
int lg = l2(n);
for (int i=1;i<=m;++i)
{
fscanf(fin,"%d %d",&l,&r);
int dist = r-l+1;
int wh = l2(dist);
int ans = a[rmq[l][wh]];
int ac = dist - (1<<wh);
if (a[rmq[l+ac][wh]] < ans)
{
ans = a[rmq[l+ac][wh]];
}
fprintf(fout,"%d\n", ans);
}
return 0;
}