Pagini recente » Cod sursa (job #713645) | Cod sursa (job #1730630) | Cod sursa (job #1727032) | Cod sursa (job #3293869) | Cod sursa (job #2617079)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int powers_of_2[31];
int sparse_table[18][100005];
int n, m;
void powgen(){
powers_of_2[0] = 1;
for(int i = 1; i < 31; i++)
powers_of_2[i] = 2 * powers_of_2[i - 1];
}
int get_log(int x){
int s = 1, d = 31;
while(s < d){
int m = s + (d - s) / 2;
if(powers_of_2[m] <= x){
s = m + 1;
}
else{
d = m;
}
}
if(powers_of_2[d] == x)
return d;
return d - 1;
}
int main(){
powgen();
f>>n>>m;
int maxp = get_log(n);
for(int i = 0; i < n; i++){
f>>sparse_table[0][i];
}
for(int p = 1; p <= maxp; p++)
for(int i = 0; i < n - (1 << p) + 1; i++){
sparse_table[p][i] = min(sparse_table[p - 1][i], sparse_table[p - 1][i + (1 << (p - 1))]);
}
int a, b;
int paux;
for(int i = 0; i < m; i++){
f>>a>>b;
b -= 1;
a -= 1; ///am urmat indexarea de la 0, nu de la 1
paux = get_log(b - a + 1);
g<<min(sparse_table[paux][b - (1 << paux) + 1], sparse_table[paux][a])<<'\n';
}
return 0;
}