Pagini recente » Cod sursa (job #2165323) | Cod sursa (job #2293842) | Cod sursa (job #1888493) | Cod sursa (job #2447055) | Cod sursa (job #2830365)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int NMAX=100005;
const int LMAX=20;
int N, M, v[NMAX], rmq[NMAX][LMAX], lg[NMAX];
void computeLog()
{
lg[1]=0;
for(int i=2;i<=N;i++)
lg[i]=lg[i/2]+1;
}
/// rmq[i][j]=valoarea minima din intervalul [i,i+2^j-1]
void computeRMQ()
{
for(int i=1;i<=N;i++)
rmq[i][0]=v[i];
for(int j=1;(1<<j)<=N;j++)
for(int i=1;i+(1<<j)-1<=N;i++)
rmq[i][j]=min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
}
int queryRMQ(int st, int dr)
{
int len=lg[dr-st+1];
return min(rmq[st][len],rmq[dr-(1<<len)+1][len]);
}
int main()
{
fin>>N>>M;
for(int i=1;i<=N;i++)
fin>>v[i];
computeRMQ();
computeLog();
int st, dr;
while(M--){
fin>>st>>dr;
fout<<queryRMQ(st,dr)<<'\n';
}
fin.close();
fout.close();
return 0;
}