Pagini recente » Profil Laura_Cornei | Cod sursa (job #1117868) | Cod sursa (job #2496044) | Istoria paginii home | Cod sursa (job #2912563)
#include <fstream>
#include <vector>
using namespace std;
void preprocess(vector<vector<int>> &table, vector<int> &v)
{
int n = (int) v.size();
int i, j;
for (i = 0; i < n; i++)
table[i][0] = i;
for (j = 1; (1 << j) <= n; j++) {
for (i = 0; i + (1 << j) <= n; i++) {
int fst_half = table[i][j - 1];
int snd_half = table[i + (1 << (j - 1))][j - 1];
table[i][j] = v[fst_half] <= v[snd_half]
? fst_half : snd_half;
}
}
}
int query(const vector<int> &v, const vector<vector<int>> &table, int i, int j)
{
if (i == j)
return v[j];
int k = j - i + 1;
int p = 0;
int w = 1;
while (w < k) {
w <<= 1;
p++;
}
p--;
int m1 = v[table[i][p]];
int m2 = v[table[j - (1 << p) + 1][p]];
return m1 < m2 ? m1 : m2;
}
int main()
{
ifstream in("rmq.in");
ofstream out("rmq.out");
int n, m, i, k = 1, lg = 0;
in >> n >> m;
vector<int> v(n);
for (i = 0; i < n; i++)
in >> v[i];
while (k < n) {
k <<= 1;
++lg;
}
vector<vector<int>> table(n, vector<int>(lg));
preprocess(table, v);
int a, b;
for (i = 0; i < m; i++) {
in >> a >> b;
out << query(v, table, a - 1, b - 1) << '\n';
}
in.close();
out.close();
return 0;
}