Pagini recente » Cod sursa (job #875711) | Cod sursa (job #528355) | Cod sursa (job #1735409) | Cod sursa (job #1068356) | Cod sursa (job #875169)
Cod sursa(job #875169)
#include <fstream>
#include <cmath>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int M[100000][17], A[100000];
void process(int N)
{
// initializeaza intervalele de lungime 1
for (int i = 0; i < N; i++) M[i][0] = i;
// calculeaza minimele pornind de la
// intervale mici spre intervale mai mari
for (int j = 1; (1 << j) <= N; j++)
{
for (int 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];
}
}
}
int RMQ(int i, int j)
{
int k = log2(j-i+1);
if (A[M[i][k]] <= A[M[j-(1 << k)+1][k]])
return A[M[i][k]];
else
return A[M[j-(1 << k)+1][k]];
}
int main()
{
int n, m, x, y;
in >> n >> m;
for (int i = 0; i < n; i++) in >> A[i];
process(n);
for (int i = 0; i < m; i++)
{
in >> x >> y;
out << RMQ(x-1, y-1) << '\n';
}
return 0;
}