Pagini recente » Cod sursa (job #209202) | Cod sursa (job #2151587)
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
#include <functional>
#include <bitset>
#include <set>
using namespace std;
int main() {
ios::sync_with_stdio(false);
string filename = "rmq";
ifstream fin(filename + ".in");
ofstream fout(filename + ".out");
int n;
fin >> n;
int m;
fin >> m;
vector<int> vec(n);
for (int i = 0; i < n; ++i)
fin >> vec[i];
vector<int> lg(n + 1);
for (int i = 2; i <= n; ++i)
lg[i] = lg[i / 2] + 1;
vector< vector<int> > RMQ(lg[n] + 1);
RMQ[0].resize(n);
for (int i = 0; i < n; ++i)
RMQ[0][i] = i;
for (int i = 1; i <= lg[n]; ++i) {
for (int j = 0; j + (1 << i) - 1 < n; ++j) {
int l = 1 << (i - 1);
int res = ((vec[RMQ[i - 1][j]] < vec[RMQ[i - 1][j + l]]) ? RMQ[i - 1][j] : RMQ[i - 1][j + l]);
RMQ[i].push_back(res);
}
}
while (m--) {
int L, R;
fin >> L >> R;
--L; --R;
int k = lg[R - L + 1];
int remaining = R - (L + (1 << k) - 1);
// L + 2^k - 1 is the index of the last element we reach starting from L
// R - last index = nr of remaining elements
if (vec[RMQ[k][L]] < vec[RMQ[k][L + remaining]])
fout << vec[RMQ[k][L]] << "\n";
else
fout << vec[RMQ[k][L + remaining]] << "\n";
}
//system("pause");
return 0;
}