Pagini recente » Istoria paginii utilizator/boicescu_theodor | Statistici Catalin Andrei (airman) | Diferente pentru winter-challenge-2008/runda-1/solutii intre reviziile 23 si 22 | Diferente pentru autumn-warmup-2007/solutii/runda-3 intre reviziile 13 si 12 | Cod sursa (job #2278049)
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int T[25][100005];
int main()
{
int n, m, i, j, k, a, b, d, l = 0, r = 31, mij;
fin >> n >> m; k = j = 1;
for(i = 1; i <= n; i++) fin >> T[0][i];
while(k <= n){
for(i = 1; i <= n; i++){
if(T[j - 1][i + k] == 0){T[j][i] = T[j - 1][i]; continue;}
T[j][i] = min(T[j - 1][i], T[j - 1][i + k]);
}
j++, k *= 2;
}
for(i = 1; i <= m; i++){
fin >> a >> b; d = b - a + 1;
n = d;l = 0; r = 31;
while(l < r){
mij = (l + r) >> 1;
if(n >> mij == 1) break;
if(n >> mij == 0) r = mij;
else l = mij;
}
k = min(T[mij][a], T[mij][a + (d - (1 << mij))]);
if(k == 0) k = 6;
fout << k << "\n";
}
return 0;
}