Pagini recente » Cod sursa (job #1555090) | Cod sursa (job #1137238) | Cod sursa (job #514302) | Cod sursa (job #2222099) | Cod sursa (job #3354197)
#include <fstream>
#include <vector>
using namespace std;
const int INF = 1e9;
vector <vector <int>> r;
vector <int> p2, v;
void precalcul() {
// etapa 1
int n = (int)v.size() - 1;
p2.resize(n + 1);
p2[1] = 0;
for (int i = 2; i <= n; i++) {
p2[i] = 1 + p2[i/2];
}
int m = 0;
while ((1 << (m + 1)) <= n) {
m++;
}
r.resize(m + 1, vector<int>(n + 1, INF));
r[0] = v;
for (int i = 1; i <= m; i++) {
for (int j = (1 << i); j <= n; j++) {
int p = (1 << (i - 1));
r[i][j] = min(r[i - 1][j - p], r[i - 1][j]);
}
}
}
int main() {
ifstream in("rmq.in");
ofstream out("rmq.out");
int n, q;
in >> n >> q;
v.resize(n + 1);
for (int i = 1; i <= n; i++) {
in >> v[i];
}
precalcul();
// etapa 2: raspundem la intrebari
for (int i = 0; i < q; i++) {
int st, dr;
in >> st >> dr;
if (st > dr) {
swap(st, dr);
}
int k = p2[dr - st + 1];
int p = (1 << k);
out << min(r[k][st + p - 1], r[k][dr]) << "\n";
}
in.close();
out.close();
return 0;
}