Pagini recente » Cod sursa (job #198571) | Cod sursa (job #1435621) | Cod sursa (job #3241929) | Cod sursa (job #2400441) | Cod sursa (job #2969785)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n,a[100005],m,lg[100005];
int M[100005][18];
int main()
{
fin>>n>>m;
for(int i=0;i<n;i++)
fin>>a[i];
lg[1]=0;
for (int i=2;i<=n;i++)
lg[i]=lg[i/2]+1;
// for(int i=1;i<=n;i++)
// fout<<lg[i]<<" ";
// fout<<"\n";
int i, j;
//initialize M for the intervals with length 1
for (i = 0; i < n; i++)
M[i][0] = i;
//compute values from smaller to bigger intervals
for (j = 1; 1 << j <= n; j++)
for (i = 0; i + (1 << j) - 1 < n; i++)
{
if (a[M[i][j - 1]] < a[M[i + (1 << (j - 1))][j - 1]])
M[i][j] = M[i][j - 1];
else
M[i][j] = M[i + (1 << (j - 1))][j - 1];
// fout<<M[i][j]<<" ";
}
int l,diff,sh,x,y;
for(i=1;i<=m;i++)
{
fin>>x>>y;
x=x-1;
y=y-1;
int l=(int)log2(y-x+1);
//fout<<l<<" "<<x<<" "<<y<<" "<<diff<<"\n\n";
if(a[M[x][l]]<=a[M[y-(1<<l)+1][l]])
fout<<a[M[x][l]]<<"\n";
else fout<<a[M[y-(1<<l)+1][l]]<<"\n";
}
return 0;
}