Pagini recente » Cod sursa (job #1277213) | Cod sursa (job #1000889) | Monitorul de evaluare | Cod sursa (job #1319197) | Cod sursa (job #2413044)
#include <cstdio>
#include <cctype>
using namespace std;
const int SIZE=(1<<17);
int pointer=SIZE;
char buffer[SIZE];
char Advance()
{
if(pointer==SIZE)
{
fread(buffer,1,SIZE,stdin);
pointer=0;
}
return buffer[pointer++];
}
int Read()
{
int Ans=0;
char ch=Advance();
while(!isdigit(ch))
ch=Advance();
while(isdigit(ch))
{
Ans=10*Ans+(ch-'0');
ch=Advance;
}
return Ans;
}
const int N = 100000 + 3;
const int LG = 17;
int n, Q;
int Rmq[N][LG];
int Log[N];
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
cin >> n >> Q;
for(int i = 1; i <= n; i++)
cin >> Rmq[i][0];
for(int i = 2; i <= n; i++)
Log[i] = 1 + Log[i / 2];
for(int k = 1; (1 << k) <= n; k++)
for(int i = 1; i + (1 << k) - 1 <= n; i++)
Rmq[i][k] = min(Rmq[i][k - 1], Rmq[i + (1 << (k - 1))][k - 1]);
for(int i = 1; i <= Q; i++)
{
int tl, tr;
cin >> tl >> tr;
int k = Log[tr - tl + 1];
int __min = min(Rmq[tl][k], Rmq[tr - (1 << k) + 1][k]);
cout << __min << "\n";
}
}