Pagini recente » Cod sursa (job #1067088) | Cod sursa (job #793662) | Cod sursa (job #1582411) | Cod sursa (job #600236) | Cod sursa (job #2294903)
#include <bits/stdc++.h>
using namespace std;
class RMQ
{
// variables
private:
int m_size;
vector <vector <int>> m_rmq_matrix;
// functions
public:
void initialize(vector <int> &first_line)
{
m_size = first_line.size();
m_rmq_matrix.push_back(first_line);
// add the rest of the lines
for(int i = 1; (1<<i) <= m_size; i++)
{
addLine(i);
}
}
int query(int i, int j)
{
int row = 31 - __builtin_clz(j-i+1);
return min(m_rmq_matrix[row][i], m_rmq_matrix[row][j - (1<<row) + 1]);
}
RMQ()
{}
RMQ(vector <int> &first_line)
{
initialize(first_line);
}
~RMQ()
{}
private:
void addLine(int line)
{
vector <int> new_line;
for(int i = 0, j = i + (1<<line) - 1; j < m_size; i++, j++)
new_line.push_back(min(query(i, j - (1<<(line - 1))), query(j - (1<<(line - 1)) + 1, j)));
m_rmq_matrix.push_back(new_line);
}
};
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int main()
{
int n,m;
fin>>n>>m;
vector <int> v(n);
for(int i = 0; i < n; i++)
fin>>v[i];
RMQ rmq(v);
int x,y;
for(int i = 0; i < m; i++)
{
fin>>x>>y;
fout<<rmq.query(x - 1 , y - 1)<<'\n';
}
return 0;
}