Pagini recente » Cod sursa (job #2873208) | Cod sursa (job #1502049) | Cod sursa (job #2537140) | Cod sursa (job #3145755) | Cod sursa (job #3209635)
#include <bits/stdc++.h>
class rmq {
private:
std::vector<std::vector<int>> dp;
int sz;
int lg;
public:
rmq()
{
this->dp.push_back({});
}
void add(int val)
{
this->dp[0].push_back(val);
}
void preprocess()
{
this->sz = this->dp[0].size();
for (this->lg = 0; 1 << (this->lg + 1) <= this->sz; ++this->lg) {}
for (int j = 1; j <= this->lg; ++j) {
dp.push_back({});
dp.back().resize(this->sz);
}
for (int j = 1; j <= this->lg; ++j)
for (int i = 0; i + (1 << (j - 1)) < this->sz; ++i)
this->dp[j][i] = std::min(this->dp[j - 1][i], this->dp[j - 1][i + (1 << (j - 1))]);
}
/**
* indexarea trebuie facuta de la 0
*/
int rangemin(int l, int r)
{
int log, range;
range = r - l + 1;
for (log = 0; (1 << (log + 1)) <= range; ++log) {}
return std::min(this->dp[log][l], this->dp[log][r - (1 << log) + 1]);
}
int size()
{
return this->dp.size();
}
void show()
{
for (int j = 0; j <= this->lg; ++j) {
for (int i = 0; i < this->sz; ++i)
std::cout << this->dp[j][i] << ' ';
std::cout << '\n';
}
}
};
int main()
{
int n, m;
rmq ds;
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
fin >> n >> m;
for (int x, i = 0; i < n; ++i) {
fin >> x;
ds.add(x);
}
ds.preprocess();
for (int l, r, i = 0; i < m; ++i) {
fin >> l >> r;
fout << ds.rangemin(l - 1, r - 1) << '\n';
}
fin.close();
fout.close();
return 0;
}