Pagini recente » Cod sursa (job #2424049) | Cod sursa (job #2235633) | Cod sursa (job #752670) | Cod sursa (job #1260031) | Cod sursa (job #1204943)
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int N,M,a[100005],MIN[100005][20];
void read();
void preprocess();
void solve();
int RMQ(int l, int r);
int main()
{
read();
preprocess();
solve();
return 0;
}
void read()
{
fin>>N>>M;
for(int i=0;i<N;i++)
{
fin>>a[i];
}
}
void preprocess()
{
for(int i=0;i<N;i++)
{
MIN[i][0] = i;
}
for(int j=1; (1 << j) <= N; j++)
{
for(int i=0; i + (1 << j) - 1 < N; i++)
{
if(a[MIN[i][j-1]] <= a[MIN[i + (1 << j) - 1][j-1]])
{
MIN[i][j] = MIN[i][j-1];
}
else
{
MIN[i][j] = MIN[i + (1 << j) - 1][j-1];
}
}
}
}
void solve()
{
int l,r;
for(int i=0; i<M; i++)
{
fin>>l>>r;
fout<<RMQ(l,r)<<'\n';
}
}
int RMQ(int l, int r)
{
int s = r - l + 1;
int k = -1; //=log(s)
while(s != 0)
{
k++;
s = s>>1;
}
if(a[MIN[l][k]] < a[MIN[r - (1 << k)][k]])
{
return a[MIN[l][k]];
}
else
{
return a[MIN[r - (1 << k)][k]];
}
}