Pagini recente » Cod sursa (job #447328) | Cod sursa (job #465872) | Cod sursa (job #60883) | Cod sursa (job #2039261) | Cod sursa (job #2564583)
#include <bits/stdc++.h>
#define nmax 100005
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int rmq[nmax][20], numere[nmax], n, m, logn;
void sparse()
{
int i, j, z, t;
for(j = 1; j <= logn; j++)
{
t = (1 << j);
z = (1 << (j - 1));
for(i = 0; i + t <= n; i++)
{
if(numere[rmq[i][j - 1]] < numere[rmq[i + z][j - 1]])
rmq[i][j] = rmq[i][j - 1];
else
rmq[i][j] = rmq[i + z][j-1];
}
}
}
int get_lg(int nbr)
{
int ans = 0;
while(nbr > 1)
nbr = (nbr >> 1), ans++;
return ans;
}
int main()
{
int i, x, y, k;
fin >> n >> m;
x = n;
logn = get_lg(n);
for(i = 0; i < n; i++)
fin >> numere[i], rmq[i][0] = i;
sparse();
for(i = 0; i < m; i++)
{
fin >> x >> y;
k = get_lg(y - x);
fout << min(numere[rmq[x - 1][k]], numere[rmq[y - (1<<k)][k]]) << '\n';
}
return 0;
}