Pagini recente » Cod sursa (job #1395185) | Cod sursa (job #545653) | Cod sursa (job #2791120) | Cod sursa (job #2700203) | Cod sursa (job #163420)
Cod sursa(job #163420)
#include <stdio.h>
int N, M;
int A[100005], Ma[100005][20];
void read()
{
int i;
freopen("rmq.in", "r", stdin);
scanf("%d%d", &N, &M);
for (i = 0; i < N; ++i)
scanf("%d", &A[i]);
}
int pozmin(int i, int j)
{
if (A[i] <= A[j])
return i;
return j;
}
void solve()
{
int i, logN, j;
for (i = 0; i < N; ++i)
Ma[i][0] = i;
for (logN = 0; (1<<logN) <= N; ++logN); --logN;
for (j = 1; j <= logN; ++j)
for (i = 0; i < N; ++i)
Ma[i][j] = pozmin(Ma[i][j-1], Ma[i+(1<<(j-1))][j-1]);
}
void write()
{
int a, b, itv, logN;
freopen("rmq.out", "w", stdout);
while (M--)
{
scanf("%d%d", &a, &b);
for (itv = b-a+1, logN = 0; (1<<logN) <= itv; ++logN); logN--;
a--, b--;
printf("%d\n", A[pozmin(Ma[a][logN], Ma[b-(1<<logN)+1][logN])]);
}
}
int main()
{
read();
solve();
write();
return 0;
}