Pagini recente » Cod sursa (job #2215271) | Cod sursa (job #534749) | Cod sursa (job #2457553) | Monitorul de evaluare | Cod sursa (job #3247776)
#include <fstream>
#include <climits>
#include <vector>
#include <queue>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int rmq[100][100005];
int put[100];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>rmq[0][i];
}
put[0]=1;
for(int i=1;i<30;i++)
{
put[i]=put[i-1]*2;
}
for(int i=1;i<=100;i++)
{
for(int k=1;k<=n-put[i-1]+1;k++)
{
rmq[i][k]=rmq[i-1][k];
if(k+put[i-1]<=n)
{
rmq[i][k]=min(rmq[i][k],rmq[i-1][k+put[i-1]]);
}
}
}
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
if(b<a)
{
swap(a,b);
}
if(a==b)
{
cout<<rmq[0][a]<<'\n';
continue;
}
int dif=b-a+1,r=0;
for(int k=0;k<=30;k++)
{
if(dif<put[k])
{
break;
}
r=k;
}
//cout<<r<<" ";
//cout<<rmq[r][a]<<'\n'<<rmq[r][b-r+1]<<'\n';
cout<<min(rmq[r][a],rmq[r][b-put[r]+1])<<'\n';
}
return 0;
}