Pagini recente » Cod sursa (job #2652903) | Borderou de evaluare (job #3283797) | Borderou de evaluare (job #3136149) | Borderou de evaluare (job #403906) | Cod sursa (job #3277903)
#include <fstream>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int v[100005], log2[100005], dp[20][100005]; ///dp[i][j]=min pe intervalul j, j+2^i
int main()
{
int n,m,l,r;
cin>>n>>m;
log2[2]=1;
for(int i=3; i<=n; i++)
log2[i]=log2[i/2]+1;
for(int i=1; i<=n; i++)
{
cin>>v[i];
if(i>1)
dp[0][i-1]=min(v[i-1],v[i]);
}
dp[0][n]=v[n];
for(int i=1; i<=log2[n]+1; i++)
for(int j=1; j<=n; j++)
if(j+(1<<i)<=n)
dp[i][j]=min(dp[i-1][j], dp[i-1][j+(1<<(i-1))]);
for(int i=1; i<=m; i++)
{
cin>>l>>r;
///min (l, r)= min( min(l, l+2^log2[r-l]) , min(r-2^log2[r-l], r) )
if(l==r)
cout<<v[l]<<'\n';
else
cout<<min(dp[log2[r-l]][l], dp[log2[r-l]][r-(1<<log2[r-l])])<<'\n';
}
return 0;
}