Pagini recente » Cod sursa (job #671680) | Cod sursa (job #2794985) | Cod sursa (job #2181814) | Cod sursa (job #1567677) | Cod sursa (job #586875)
Cod sursa(job #586875)
#include <cstdio>
int M[100][10];
int RMQ(int i, int j, int *A, int size);
int log2(int n);
int main()
{
int N, qs, A[100];
FILE *f = fopen("rmq.in", "r");
FILE *g = fopen("rmq.out", "w");
fscanf(f, "%d %d\n", &N, &qs);
for (int i = 0 ; i < N ; ++i)
{
fscanf(f, "%d", &A[i]);
M[i][0] = i;
}
for (int j = 1 ; (1 << j) <= N ; ++j)
{
for (int i = 0 ; i <= N - (1 << j) ; ++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];
}
}
for (int i = 0 ; i < qs ; ++i)
{
int left, right;
fscanf(f, "%d %d\n", &left, &right);
fprintf(g, "%d\n", A[RMQ(left - 1, right - 1, A, N)]);
}
return 0;
}
int RMQ(int i, int j, int *A, int size)
{
int k = log2(j - i + 1);
if (A[M[i][k]] <= A[M[j - (1 << k) + 1][k]])
return M[i][k];
return M[j - (1 << k) + 1][k];
}
int log2(int n)
{
int answer = 0;
while ((n & (1 << 30 - answer)) == 0)
answer++;
return (30 - answer);
}