Pagini recente » Cod sursa (job #443952) | Cod sursa (job #432553) | Cod sursa (job #393345) | Cod sursa (job #1184749) | Cod sursa (job #2816649)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
/**
dp[i][j]
for (i = 1; i <= n; i++)
for (k = i; k <= j; k++)
dp[i][j] = min (dp[i][j], a[k]);
i j
9 7 7 2 11 4 1 2 6 3
for (j=1; (j << i) <=n;j++)
for (i=1;i <= n - (1 << j)+1;i++)
i = 2
j = 8
rmq[i][j] = rmq[i + 1][j - 1], rmq[i + (1 << j - 1)][j - 1]
*/
int n , m;
int dp[100005][20], a[100005], lg[100005];
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; i++)
{
fin >> a[i];
dp[i][0] = a[i];
}
for (int i = 1; (1 << i) <= n; i++) /// lungimea intervalului
for (int j = 1; j + (1 << i) - 1<= n; j++) /// pozitia la care incepe
dp[j][i] = min (dp[j][i - 1], dp[j + (1 << (i - 1))][i - 1]);
lg[1] = 0;
for (int i = 2;i <= n; i++)
lg[i] = lg[i / 2] + 1;
for (int i = 1; i <= m; i++)
{
int x , y;
fin >> x >> y;
int k = lg[y - x + 1];
fout << min (dp[x][k] , dp[y - (1 << k) + 1][k]) << "\n";
}
return 0;
}