Pagini recente » Cod sursa (job #554946) | Cod sursa (job #2748891) | Cod sursa (job #2149025) | Cod sursa (job #2110418) | Cod sursa (job #1265192)
// Se da un vector si doi indici
// Sa se determine pozitia elementului minim situat intre cei doi indici.
#include <fstream>
#define NMAX 100001
#define LMAX 18
// 2^17 = 131072
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, i, a[NMAX], m[LMAX][NMAX], s, d, q, lu, lg[NMAX], l;
void dina () {
int c, l;
//
for (c = 1; c <= n; c++) // Minimele pentru secventele de lungime 1 = 2^0.
m[0][c] = a[c];
for (l = 1; (lu = (1 << l)) <= n; l++) // Minimele pentru secvente de lungime 2^l.
for (c = 1; c + (lu - 1) <= n; c++) // Capatul drept sa fie in sir.
m[l][c] = min (m[l - 1][c], m[l - 1][c + lu / 2]); // Comparam minimele din cele 2 jumatati ale intervalului.
}
int main() {
fin >> n >> q;
for (i = 1; i <= n; i++)
fin >> a[i];
dina ();
lg[1] = 0;
for (i = 2; i <= n; i++) // [log2 i]
lg[i] = lg[i / 2] + 1;
/*
for (s = 1; s <= n; s++)
for (d = s; d <= n; d++) {
lu = d - s + 1; l = lg[lu]; // linia din care luam informatiile
fout << '[' << s << ',' << d << "] = " << min (m[l][s], m[l][d - (1 << l) + 1]) << '\n';
}
*/
for (i = 1; i <= q; i++) {
fin >> s >> d;
lu = d - s + 1; l = lg[lu]; // linia din care luam informatiile
fout << min (m[l][s], m[l][d - (1 << l) + 1]) << '\n';
}
return 0;
}
/*
s == 13, d == 20
lu == 8, l == 3
d-(1<<l)+1 == 13
s == 12, d == 20
lu == 9, l == 3
d-(1<<l)+1 == 13
s == 14, d == 20
lu == 7, l == 2
d-(1<<l)+1 == 17
*/