Pagini recente » Cod sursa (job #1072179) | Cod sursa (job #851794) | Cod sursa (job #2043993) | Cod sursa (job #1306898) | Cod sursa (job #2194473)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
const int N=100005;
const int L=16;
int n,m,a[N], r[L][N],lg[N];
/*
r[i][j] = min (v[j], v[j-1], ..., v[j - 2^i + 1]) = minimul pe intervalul de lungime 2^i care se termina in j
r[i][j] = min(r[i-1][j], r[i-1][j - (1<<i)])
query(a, b):
min(r[l][a+(1<<l)-1], r[l][b])
l = [log(b-a)]
lg[1] = 0;
for (i = 1; i <= n; i++)
{
lg[i] = 1 + lg[i/2];
}
*/
int main()
{
int i,j,l;
in>>n>>m;
for(i=1; i<=n; i++)
in>>a[i];
for(i=2; i<=n; i++)
lg[i]=1+lg[i/2];
for(i=1; i<=n; i++)
r[0][i]=a[i];
for(i=1; (1<<i)<=n; i++)
for(j=1; j<=n-(1<<j)+1; j++)
{
r[i][j]=min(r[i-1][j],r[i-1][j-(1<<i)]);
}
while(m!=0)
{
int a,b;
in>>a>>b;
l=lg[a-b];
out<<min(r[l][a+(1<<l)-1],r[l][b])<<'\n';
m--;
}
return 0;
}