Pagini recente » Cod sursa (job #506310) | Cod sursa (job #1931976) | Cod sursa (job #2641496) | Cod sursa (job #2459292) | Cod sursa (job #1302116)
#include <fstream>
using namespace std;
ifstream F("rmq.in");
ofstream G("rmq.out");
const int N = 100010;
int n,m,a[N],rmq[20][N],lg[N];
int good(int x,int y)
{
if ( a[x] < a[y] )
return x;
return y;
}
int ask(int x,int y)
{
int wh = lg[y-x+1];
return good(rmq[wh][x],rmq[wh][y-(1<<wh)+1]);
}
void build()
{
for (int i=1;(1<<i)<=n;++i)
lg[(1<<i)]++;
for (int i=1;i<=n;++i)
lg[i] += lg[i-1];
for (int i=1;i<=n;++i)
rmq[0][i] = i;
for (int i=1;(1<<i)<=n;++i)
for (int j=1;j<=n;++j)
rmq[i][j] = j + (1<<i)/2 <= n ? good(rmq[i-1][j],rmq[i-1][j+(1<<i)/2]) : rmq[i-1][j];
}
int main()
{
F>>n>>m;
for (int i=1;i<=n;++i)
F>>a[i];
build();
for (int i=1,x,y;i<=m;++i)
{
F>>x>>y;
G<<a[ask(x,y)]<<'\n';
}
}