Pagini recente » Cod sursa (job #2911718) | Cod sursa (job #3152293) | Cod sursa (job #3275860) | Cod sursa (job #254729) | Cod sursa (job #2622404)
#include <bits/stdc++.h>
std::ifstream fin("rmq.in");
std::ofstream fout("rmq.out");
const int N = 100001;
int n, m, v[N], lg[N + 1], rmq[20][N + 1];
int main()
{
int i, pas, a, b, lgdif;
fin >> n >> m;
for(i = 0; i < n; i++)
fin >> v[i];
for(i = 2; i <= n; i++)
lg[i] = lg[i / 2] + 1;
for(i = 0; i < n; i++)
rmq[0][i] = v[i]; //minimul din urmatoarele 1 elem de pe poz i este evident i
for (pas = 1; (1 << pas) <= n; pas++) // 2 la pas <= n
for (i = 0; i + (1 << pas) - 1 < n; i++) // ultimele sunt la fel ca mai sus
rmq[pas][i] = std::min(rmq[pas - 1][i] , rmq[pas-1][ i + (1 << (pas - 1))]);
for(i = 0; i < m; i++)
{
fin >> a >> b;
lgdif = lg[b - a + 1]; //sa stim pe ce putere ne uitam in tabel
fout << std::min(rmq[lgdif][a - 1], rmq[lgdif][b - (1 << lgdif)]) << '\n'; //suprapunem intervalele pt a avea 1 sg pas, nu log cum ar fi sa luam pe bucati ex pt 1-7: 1-4, 5-6, 7; luam direct min pe 1-4 si 4-7
}
return 0;
}