Pagini recente » Cod sursa (job #1969761) | Cod sursa (job #1914647) | Cod sursa (job #1836461) | Cod sursa (job #1091670) | Cod sursa (job #2786830)
#include <fstream>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
#define NMAX 100005
int n, m, arb[4 * NMAX], a[NMAX + 5];
void citire() {
f >> n >> m;
for (int i = 0; i < n; ++i)
f >> a[i];
}
void initializare_arbore(int poz, int st, int dr) {
if (st == dr) {
arb[poz] = st;
return;
}
initializare_arbore(2 * poz, st, (st + dr) / 2);
initializare_arbore(2 * poz + 1, (st + dr) / 2 + 1, dr);
arb[poz] = (a[arb[2 * poz]] <= a[arb[2 * poz + 1]]) ? arb[2 * poz] : arb[2 * poz + 1];
}
int query(int poz, int st, int dr, int sti, int dri) {
if (dr < sti || dri < st)
return -1;
if (sti <= st && dr <= dri)
return arb[poz];
int poz1 = query(2 * poz, st, (st + dr) / 2, sti, dri);
int poz2 = query(2 * poz + 1, (st + dr) / 2 + 1, dr, sti, dri);
if (poz1 == -1)
return poz2;
if (poz2 == -1)
return poz1;
return (a[poz1] <= a[poz2]) ? poz1 : poz2;
}
void rezolvare() {
int sti, dri;
for (int i = 0; i < m; ++i) {
f >> sti >> dri;
g << a[query(1, 0, n - 1, sti - 1, dri - 1)] << '\n';
}
}
int main() {
citire();
initializare_arbore(1, 0, n - 1);
rezolvare();
return 0;
}