Mai intai trebuie sa te autentifici.
Cod sursa(job #2174079)
Utilizator | Data | 16 martie 2018 10:40:58 | |
---|---|---|---|
Problema | Range minimum query | Scor | 20 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.08 kb |
#include <iostream>
#include <fstream>
#define dimn 1000005
#define dimp 21
std::ifstream f("rmq.in");
std::ofstream g("rmq.out");
int N, M;
int v[dimn];
int pow2[dimp];
int log2(int x) {
int res = 0;
while(x>1) x/=2, res++;
return res;
} void precalc() {
pow2[0] = 1;
for (int i=1; i<dimp; i++)
pow2[i] = pow2[i-1]*2;
}
int rmq[dimp][dimn];
void calc_rmq() {
for (int i=0; i<N; i++) rmq[0][i+1] = v[i+1];
for (int i=1, j; pow2[i]<=N; i++) {
for (j=1; j+pow2[i]-1<=N; j++) {
rmq[i][j] = std::min(rmq[i-1][j], rmq[i-1][j+pow2[i-1]]);
}
}
}
void query(int a, int b) {
int len = b-a+1;
int rmqord = log2(len);
g << std::min (rmq[rmqord][a], rmq[rmqord][b-pow2[rmqord]+1]) << '\n';
}
void citire() {
f >> N >> M;
for (int i=0; i<N; i++)
f >> v[i+1];
}
void rezolvare() {
calc_rmq();
for (int i=0, a, b; i<M; i++) {
f >> a >> b;
query(a, b);
}
}
int main()
{
precalc();
citire();
rezolvare();
return 0;
}