Pagini recente » Cod sursa (job #1290345) | Cod sursa (job #635052) | Cod sursa (job #3306404) | Cod sursa (job #895915) | Cod sursa (job #3310189)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// this is a sparse table implementation for range minimum queries
// log - precomputes logs for numbers up to n
// table holds range of values based on powers of 2
// table[0][i] = a[i]
// table[1][i] = min(a[i], a[i + 1])
// table[2][i] = min(a[i], a[i + 1], a[i + 2], a[i + 3])
// table[3][i] = min(a[i], a[i + 1], a[i + 2], a[i + 3], a[i + 4], a[i + 5], a[i + 6], a[i + 7])
// and so on...
vector<int> getLogs(int n)
{
vector<int> log(n + 1);
log[0] = 0;
log[1] = 0;
for (int i = 2; i <= n; ++i)
{
log[i] = log[i / 2] + 1;
}
return log;
}
vector<vector<int>> makeTable(int n, const vector<int>& a)
{
vector<int> log = getLogs(n);
int k = log[n] + 1;
vector<vector<int>> table(k + 1, vector<int>(n));
for (int i = 0; i < n; ++i)
table[0][i] = a[i];
for (int j = 1; j <= k; ++j)
{
for (int i = 0; i <= n - (1 << j); ++i)
{
table[j][i] = min(table[j - 1][i], table[j - 1][i + (1 << (j - 1))]);
}
}
return table;
}
int queryTable(int l, int r, const vector<int>& log, const vector<vector<int>>& table)
{
int len = r - l + 1;
int k = log[len];
return min(table[k][l], table[k][r - (1 << k) + 1]);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr); // delete for interactive problems
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, m;
fin >> n >> m;
vector<int> a(n);
for (int i = 0; i < n; i++)
fin >> a[i];
vector<vector<int>> table = makeTable(n, a);
for (int i = 0; i < m; i++)
{
int l, r;
fin >> l >> r;
l--; r--;
fout << queryTable(l, r, getLogs(n), makeTable(n, a)) << "\n";
}
return 0;
}