Pagini recente » Cod sursa (job #1930005) | Cod sursa (job #2384123) | Cod sursa (job #2294811) | Cod sursa (job #143403) | Cod sursa (job #1163672)
#include <fstream>
const int NMAX = 100005;
const int LGMAX = 20;
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int n,m,A[NMAX],M[NMAX][20],x,y,dif,Lg;
void RMQ()
{
for (int i = 1; i <= n; ++i)
{
M[i][0] = i;
}
for (int j = 1; (1<<j) <= n; ++j)
{
for (int i = 1; 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];
}
}
}
int logaritm(int x)
{
int ans = 0;
while (x > 1)
{
ans++;
x /= 2;
}
return ans;
}
int main()
{
f >> n >> m;
for (int i = 1; i <= n; ++i)
{
f >> A[i];
}
RMQ();
for (int i = 1; i <= m; ++i)
{
f >> x >> y;
dif = y - x + 1;
Lg = logaritm(dif);
if (A[ M[x][Lg] ] < A[ M[y-(1<<Lg)+1][Lg] ])
g << A[ M[x][Lg] ] << '\n';
else g << A[ M[y-(1<<Lg)+1][Lg] ] << '\n';
}
f.close();
g.close();
return 0;
}