Pagini recente » Cod sursa (job #1611075) | Cod sursa (job #1461671) | Cod sursa (job #3894) | Cod sursa (job #1002317) | Cod sursa (job #1185206)
using namespace std;
#include <fstream>
#include <cmath>
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int Nmax=100000;
const int logN=20;
int v[Nmax];
int rmq[Nmax][logN];
void preprocess(int) ;
int query(int, int) ;
int main()
{
int i, j, n, q, a, b;
fin>>n;fin>>q;
for(i=0; i<n; ++i) fin>>v[i];
preprocess(n);
/*
for(i=0; i<n; ++i)
{
for(j=0; i+(1<<j)<=n; ++j)
fout<<rmq[i][j]<<' ';
fout<<'\n';
}
*/
for(i=0; i<q; ++i)
{
fin>>a>>b;
fout<<v[query(a-1, b-1)]<<'\n';
}
return 0;
}
void preprocess(int n)
{
int i, j;
for(i=0; i<n; ++i) rmq[i][0]=i;
for(i=1; (1<<i)<n; ++i)
{
for(j=0; (1<<i)+j<=n; ++j)
{
if(v[rmq[j][i-1]]<v[rmq[j+(1<<(i-1))][i-1]])
rmq[j][i]=rmq[j][i-1];
else rmq[j][i]=rmq[j+(1<<(i-1))][i-1];
}
}
}
int query(int st, int dr)
{
int log=log2(dr-st+1);
if(v[rmq[st][log]]<v[rmq[dr+1-(1<<log)][log]])
return rmq[st][log];
return rmq[dr+1-(1<<log)][log];
}