Pagini recente » Cod sursa (job #3138447) | Cod sursa (job #1979319) | Cod sursa (job #1134458) | Cod sursa (job #1343539) | Cod sursa (job #2956534)
// 1 -> 1e8
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int NMAX = 1e5;
const int LGMAX = 17;
const int INF = 1e9;
int N, Q;
int v[NMAX + 1];
// int rasp[NMAX + 1][NMAX + 1]; // raspunsul pentru fiecare pereche ordonata x, y (x <= y)
int rasp[LGMAX][NMAX + 1]; // rasp[i][j] =def= raspunsul pentru secventa [j, j + 2^i)
// pentru i = 0 -> [j, j + 2^0) = [j, j + 1)
// j, j + 1, j + 2, ..., j + (2 ^ i) - 1
// [x..y] -> min([x, x + 2^lg - 1], [y - 2^lg + 1, y])
int lg2[NMAX + 1];
int main() {
fin >> N >> Q;
for(int i = 1; i <= N; i++) {
fin >> v[i];
}
// // O(Q * N)
// for(int tc = 1; tc <= Q; tc++) {
// int x, y; // x = 1, y = N
// fin >> x >> y;
// int mn = INF; // v[x]
// for(int i = x; i <= y; i++) {
// mn = min(mn, v[i]);
// }
// fout << mn << '\n';
// }
// 1 <= N <= 1000
// 1 <= Q <= 1 000 000
// O(N^2 + Q)
// for(int i = 1; i <= N; i++) {
// int mn = INF;
// for(int j = i; j <= N; j++) {
// mn = min(mn, v[j]);
// rasp[i][j] = mn;
// }
// }
// for(int tc = 1; tc <= Q; tc++) {
// int x, y;
// fin >> x >> y;
// fout << rasp[x][y] << '\n';
// }
for(int i = 1; i <= N; i++) {
rasp[0][i] = v[i];
}
for(int i = 1; (1 << i) <= N; i++) {
for(int j = 1; j + (1 << i) - 1 <= N; j++) {
rasp[i][j] = min(rasp[i - 1][j], rasp[i - 1][j + (1 << (i - 1))]);
}
} // min, max, cmmdc
lg2[1] = 0;
for(int i = 2; i <= N; i++) {
lg2[i] = lg2[i / 2] + 1;
}
for(int tc = 1; tc <= Q; tc++) {
int x, y;
fin >> x >> y;
int lung = (y - x + 1), lg = lg2[lung];
fout << min(rasp[lg][x], rasp[lg][y - (1 << lg) + 1]) << '\n';
}
return 0;
}