Pagini recente » Cod sursa (job #1347870) | Cod sursa (job #2779193) | Cod sursa (job #1045222) | Cod sursa (job #2500319) | Cod sursa (job #2540240)
#include <fstream>
#include <algorithm>
#define BAZA 256
using namespace std;
ifstream fin ("rmq.in");
ofstream fout("rmq.out");
/**
e = 0: 2 4 1 8 9 3 8 6 9
e = 1: 2 1 1 8 3 3 6 6 9
e = 2: 1 1 1 3 3 3 6 6 9
e = 3: 1 1 1 3 3 3 6 6 9
st = 4 si dr = 8 rasp 3
**/
int lg[100010];
int d[17][100010];
int e, i, j, n, q, st, dr;
int main () {
/// se da un sir care ramane fix si asupra lui sunt doar interogari
/// [st dr] cu semnificatia: care este minimul din intervalul de indici
/// [st dr] inclusiv
/// facem o precualculare: d[e][i] = minimul dintr-o secventa
/// de lungime 2 la e care incepe la pozitia i
fin>>n>>q;
for (i=1;i<=n;i++)
fin>>d[0][i];
for (e = 1;(1<<e) <= n; e++) {
for (i=1;i<=n;i++) {
/// d[e][i]
d[e][i] = d[e-1][i];
j = i+ (1<<(e-1));
if ( j <= n && d[e-1][j] < d[e][i])
d[e][i] = d[e-1][j];
}
}
/// avem precalcular la fiecare pozitie de inceput posibila
/// minime pe toate secventele de lungime putere de 2 ce pornesc de acolo
lg[1] = 0;
for (i=2;i<=n;i++)
lg[i] = lg[i/2]+1;
/// lg[i] = exponentul primei puteri de 2 mai mare sau egale cu jumatatea lui i
/// altfel spus al celei mai mari puteri de 2 mai mica sau egala cu i
for (i=1;i<=q;i++) {
fin>>st>>dr;
e = lg[dr-st+1];
fout<<min(d[e][st], d[e][dr-(1<<e)+1] )<<"\n";
}
return 0;
}