Pagini recente » Cod sursa (job #344715) | Cod sursa (job #2265293) | Cod sursa (job #1554236) | Cod sursa (job #51939) | Cod sursa (job #2719463)
#include <fstream>
using namespace std;
ifstream cin ("rmq.in");
ofstream cout ("rmq.out");
int n, m;
int x[100008], v[20][100008];
void rmq()
{
for(int i = 1; i <= n; ++i)
{
v[0][i] = x[i];
}
for(int i = 1; (1 << i) - 1 <= n; ++i)
{
for(int j = 1; j + (1 << i) - 1 <= n; ++j)
{
v[i][j] = min(v[i - 1][j], v[i - 1][j + (1 << (i - 1))]);
}
}
}
int query(int a, int b)
{
if(a > b)
{
a += b;
b = a - b;
a -= b;
}
int p2 = 1, pp2 = 0, l = b - a + 1;
while(p2 <= l)
{
p2 *= 2;
++pp2;
}
p2 /= 2;
--pp2;
return min(v[pp2][a], v[pp2][b - p2 + 1]);
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; ++i)
{
cin >> x[i];
}
rmq();
for(int i = 1; i <= m; ++i)
{
int a, b;
cin >> a >> b;
cout << query(a, b) << '\n';
}
return 0;
}