Pagini recente » Cod sursa (job #889976) | Diferente pentru home intre reviziile 235 si 236 | Cod sursa (job #1515856) | Cod sursa (job #1569162) | Cod sursa (job #2901418)
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;
int RMQ_matrix[100000][17]; //cringe, dar e prea mare bataie de cap
// sa lucrez cu un container dinamic
ofstream out("rmq.out");
void computeRMQ(vector<int>& v)
{
int n = v.size();
int log = 0;
while (n)
{
n = n >> 1;
++log;
}
n = v.size();
for (int i = 0; i < n; ++i)
RMQ_matrix[i][0] = v[i];
for (int j = 1; j <= log; ++j)
{
for (int i = 0; i < n; ++i)
{
/*out << j << " " << i << "\n";*/
if(i + (1 << (j - 1)) < 100000)
RMQ_matrix[i][j] = min(RMQ_matrix[i][j - 1], RMQ_matrix[i + (1 << (j - 1))][j - 1]);
else
RMQ_matrix[i][j] = 0;
}
}
}
int query(int x, int y)
{
--x;
--y;
int size = y - x + 1;
int log = 0;
while (size>=2)
{
size = size >> 1;
++log;
}
return min(RMQ_matrix[x][log], RMQ_matrix[y - (1 << log) + 1][log]);
}
int main()
{
ifstream in("rmq.in");
int n, nr_ops;
in >> n >> nr_ops;
vector<int> nrs;
for (int i = 0; i < n; ++i)
{
int nr;
in >> nr;
nrs.push_back(nr);
}
computeRMQ(nrs);
for (int i = 0; i < nr_ops; ++i)
{
int p1, p2;
in >> p1 >> p2;
out << query(p1, p2) << "\n";
}
return 0;
}