Pagini recente » Cod sursa (job #384899) | Cod sursa (job #1602810) | Cod sursa (job #2458194) | Cod sursa (job #1875874) | Cod sursa (job #1735574)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
ifstream cin ("rmq.in");
ofstream cout ("rmq.out");
int a[20][100005], v[100005]; // a - tabela
int main ()
{
int n, m; cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> v[i];
}
for (int j = 1; j <= n; ++j) { // punem numerele citite pe prima linie a matricei a
a[0][j] = v[j];
}
int k = 2;
int range;
for (int i = 1; k <= n; ++i) // pentru i de la 1 la k
{ // k - putere de 2, k <= n; matricea va avea log2(n) linii
for (int j = 1; j <= n - k + 1; ++j) // fiecare minim va actiona pe 2^l elemente, l = 1, 2, 3, ...
{
range = k / 2;
a[i][j] = min(a[i - 1][j], a[i - 1][j + range]); // distanta pe care este minimul
}
k *= 2;
}
for (int i = 0; i < m; ++i)
{
int x, y; cin >> x >> y;
int dist = y - x + 1; // distanata dintre x si y
int k = log2 (dist);
int p = dist - (1 << k) + x;
int answer = min( a[k][x], a[k][p]);
cout << answer << "\n";
}
return 0;
}