Pagini recente » Cod sursa (job #550706) | Cod sursa (job #475116) | Cod sursa (job #1440926) | Cod sursa (job #3300199) | Cod sursa (job #2625322)
#include <iostream>
#include <algorithm>
#include <cmath>
#include <fstream>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int A[100001];
int RMQ[100001][18];
void preCalculation(unsigned n)
{
for(int i = 0; i < n; i++)
RMQ[i][0]=i;
for(unsigned j = 1; 1u << j <= n; j++)
for(unsigned i = 0; i + (1u<<j) - 1 < n; i++)
if(A[RMQ[i][j - 1]] < A[RMQ[i + (1u << (j - 1))][j - 1]])
RMQ[i][j] = RMQ[i][j - 1];
else
RMQ[i][j] = RMQ[i + (1u << (j - 1))][j - 1];
}
int minim(int x, int y)
{
unsigned logLength = log2(y - x + 1);
if(A[RMQ[x][logLength]] < A[RMQ[y - (1u << logLength) + 1][logLength]])
return A[RMQ[x][logLength]];
return A[RMQ[y - (1u << logLength) + 1][logLength]];
}
int main()
{
int n, m;
in >> n >> m;
for(int i = 0; i < n; i++)
in >> A[i];
preCalculation(n);
int x, y;
for(int i = 0;i < m; i++)
{
in >> x >> y;
out << minim(x - 1,y - 1)<<"\n";
}
return 0;
}