Pagini recente » Cod sursa (job #1583063) | Cod sursa (job #2368965) | Cod sursa (job #869820) | Cod sursa (job #1758634) | Cod sursa (job #2861460)
#include <bits/stdc++.h>
// ne intereseaza minimul la un sir
using namespace std;
#define Nmax 100005
int sir[Nmax];
int rmq[Nmax][30];
int n, m;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
void citire()
{
fin >> n >> m;
for(int i = 1; i <= n; i++)
{
fin >> sir[i];
}
}
void RMQ()
{
for(int i = 1 ; i <= n; i++)
{
rmq[i][0] = i;
}
for(int i = 1; (1 << i) <= n; i++)
{
for(int poz = 1; poz + (1 << i) - 1 <= n; poz++)
{
// comparam doua jumatati
if(sir[ rmq[poz][i-1] ] < sir[ rmq[poz+(1 << (i-1))][i-1] ])
{
rmq[poz][i] = rmq[poz][i-1];
}
else
{
rmq[poz][i] = rmq[poz+(1 << (i-1))][i-1];
}
}
}
}
void query()
{
int a, b;
for(int i = 0; i < m; i++)
{
fin >> a >> b;
if(a < b)
{
int dist = log2(b - a);
fout << min(sir[rmq[a][dist]], sir[rmq[b - (1 << dist) + 1][dist]]) << endl;
}
else
{
int dist = log2(a - b);
fout << min(sir[rmq[b][dist]], sir[rmq[a - (1 << dist) + 1][dist]]) << endl;
}
}
}
int main()
{
citire();
RMQ();
query();
}