Pagini recente » Cod sursa (job #184069) | Cod sursa (job #2687589) | Istoria paginii runda/maneleobisnuite/clasament | Statistici Ratiu Ioan (ratiu) | Cod sursa (job #2187746)
#include <iostream>
#include <fstream>
#define DMAX 100001
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
int n, m;
int minim[17][DMAX],logInter[DMAX], nrIntervale;
void citire(){
in >> n >> m;
for(int i = 1; i <= n; i++){
in >> minim[0][i];//minimul pe intervalul de lungime 1
}
}
void logaritmInter(){
for(int i = 1; i <= n; i++){
logInter[i] = logInter[i/2] + 1;
}
nrIntervale = logInter[n] - 1;
}
void creareMatriceMinime(){
for(int lungimeInter = 1; lungimeInter <= nrIntervale; lungimeInter++){
int limita = 1 << lungimeInter;
for(int index = 1; index + limita <= n + 1; index++){
int lin = lungimeInter, col = index;
minim[lin][col] = min(minim[lin - 1][col], minim[lin - 1][col + (1 << (lungimeInter - 1))]);
}
}
}
void rezolvare(){
for(int i = 1; i <= m; i++){
int st, dr;
in >> st >> dr;
dr++;//ca sa nu mai fac dr-st+1
int lungimeInterval = dr - st;
int incadrareInterLin = logInter[lungimeInterval] - 1;//am numerotarea de la 0!
int minimul = min(minim[incadrareInterLin][st], minim[incadrareInterLin][dr - (1 << incadrareInterLin)]);
out << minimul << '\n';
}
}
int main() {
citire();
logaritmInter();
creareMatriceMinime();
rezolvare();
return 0;
}