Pagini recente » Cod sursa (job #1751470) | Cod sursa (job #415681) | Cod sursa (job #595823) | Cod sursa (job #1515893) | Cod sursa (job #3301657)
#include <fstream>
using namespace std;
int v[100005], log2[100005];
int dp[20][100005]; ///dp[k][i] = min din intervalul i, i+2^k
int main()
{
ifstream cin("rmq.in");
ofstream cout("rmq.out");
log2[2]=1;
for(int i=3; i<=100000; i++)
log2[i]=log2[i/2]+1;
int n,q;
cin>>n>>q;
for(int i=1; i<=n; i++)
cin>>v[i];
for(int i=1; i<n; i++)
dp[0][i]=min(v[i], v[i+1]);
for(int k=1; (1<<k)<n; k++)
{
for(int i=1; i<=n-(1<<k); i++)
dp[k][i]=min(dp[k-1][i], dp[k-1][i+(1<<(k-1))]);
}
while(q--)
{
int st,dr;
cin>>st>>dr;
if(st==dr)
{
cout<<v[st]<<'\n';
continue;
}
int dif=dr-st, put=log2[dif];
cout<<min(dp[put][st], dp[put][dr-(1<<put)])<<'\n';
}
return 0;
}