Pagini recente » Cod sursa (job #217941) | Cod sursa (job #1776275) | Cod sursa (job #220366) | Cod sursa (job #445977) | Cod sursa (job #3133124)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int n, m;
int a[1000000], st[100000000];
//arbori de intervale
void arbore(int p, int L, int R) // constuieste arborele cu indexul curent p si indicii L si R care sunt nr din vector pe parcursul parcurgerii lui
{
if (L == R) //are un singur element =>
{
st[p] = a[L];
}
else // spargem intervalul in 2
{
int mid = (L + R) / 2;
arbore(2 * p, L, mid);
arbore(2 * p + 1, mid + 1, R);
st[p] = min(st[2 * p], st[2 * p + 1]); //luam minimul dintre minimele rezultate
}
}
int query(int p, int L, int R, int i, int j) //query cu indexul curent p, L,R, si capetele intervalului i, j
{
if (i > R || j < L) // daca nu e in interval
{
return 1000000;
}
if (i <= L && j >= R)
{
return st[p]; // se returneaza val stocata inn st[p] adica min
}
int mid = (L + R) / 2;
return min(query(2 * p, L, mid, i, j), query(2 * p + 1, mid + 1, R, i, j)); // minimul dintre rezultate
}
int main()
{
ifstream fin("rmq.in");
ofstream fout("rmq.out");
fin >> n >> m;
for (int i = 1; i <= n; ++i)
{
fin >> a[i];
}
arbore(1, 1, n);
for (int i = 0; i < m; ++i)
{
int x, y;
fin >> x >> y;
int k = query(1, 1, n, x, y);
fout << k << "\n";
}
fin.close();
fout.close();
return 0;
}