Pagini recente » Cod sursa (job #313872) | Cod sursa (job #2495992) | Cod sursa (job #292833) | Cod sursa (job #438074) | Cod sursa (job #982871)
Cod sursa(job #982871)
#include <fstream>
using namespace std;
const int Nmax = 100010;
const int Lgmax = 20;
ifstream F("rmq.in");
ofstream G("rmq.out");
int RMQ[Lgmax][Nmax];
int Log[Nmax],N,M;
int A[Nmax];
void Make_RMQ(int N)
{
for (int i=1,j=0;i<=N;i*=2,++j)
Log[i] = j;
for (int i=2;i<=N;++i)
Log[i] = Log[i] == 0 ? Log[i-1] : Log[i];
for (int i=1;i<=N;++i)
RMQ[0][i] = A[i];
for (int now=1;now<=Log[N];++now)
{
int step = (1<<now) / 2;
for (int i=1;i<=N-step;++i)
RMQ[now][i] = min( RMQ[now-1][i] , RMQ[now-1][i+step] );
}
}
int ask(int x,int y)
{
int len = y-x+1;
int now = Log[len];
int step = (1<<now);
return min( RMQ[now][x] , RMQ[now][y-step+1] );
}
int main()
{
F>>N>>M;
for (int i=1;i<=N;++i)
F>>A[i];
Make_RMQ(N);
for (int i=1,x,y;i<=M;++i)
{
F>>x>>y;
G<<ask(x,y)<<'\n';
}
}