Pagini recente » Cod sursa (job #1809093) | Cod sursa (job #1345043) | Cod sursa (job #1572552) | Istoria paginii runda/leitennine/clasament | Cod sursa (job #1218770)
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int N,M;
int DP[17][100005]; /// DP[i][j] -> minimul unei secvente de 2^i caractere care incepe pe pozitia j
void read( void )
{
scanf("%d%d",&N,&M);
for(int i = 1; i <= N; ++i)
scanf("%d",&DP[0][i]);
}
void precalc( void )
{
int lg = log2(N);
for(int i = 1; i <= lg; ++i)
for(int j = 1; j <= N; ++j)
if(j + (1 << i) - 1 > N)
DP[i][j] = DP[i-1][j];
else
DP[i][j] = min(DP[i-1][j],DP[i-1][j+(1<<i)-1]);
}
int Querry(int a,int b)
{
int lung = b-a+1,lg;
lg = log2(lung);
return min(DP[lg][a],DP[lg][ b - (1<<lg) + 1]);
}
void solve()
{
int a,b;
for(int i = 1; i <= M; ++i)
{
scanf("%d%d",&a,&b);
printf("%d\n",Querry(a,b));
}
}
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
read();
precalc();
solve();
return 0;
}