Pagini recente » Cod sursa (job #2930044) | Cod sursa (job #2222499) | Cod sursa (job #994842) | Cod sursa (job #1845353) | Cod sursa (job #1805437)
#include <bits/stdc++.h>
#define DIMMAX 100005
#define LOGDIMMAX 17
#define FOR(i, a, b) for(int i = a; i <= b; i++)
using namespace std;
int M[DIMMAX][LOGDIMMAX];
void process2(int M[DIMMAX][LOGDIMMAX], int A[DIMMAX], int 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];
}
int rezultat(int i,int j,int M[DIMMAX][LOGDIMMAX], int A[DIMMAX])
{
int k;
k = log2(j - i + 1);
if(A[M[i][k]] <= A[M[j - (1<<k) + 1][k]])
return A[M[i][k]];
return A[M[j - (1<<k) + 1][k]];
}
int main()
{
ifstream f("rmq.in");
ofstream g("rmq.out");
int A[DIMMAX], n, m;
f>>n>>m;
FOR(i, 0, n-1)
f>>A[i];
process2(M, A, n);
FOR(i, 1, m)
{
int x, y;
f>>x>>y;
g<<rezultat(x - 1, y - 1, M, A)<<'\n';
}
f.close();
g.close();
return 0;
}