Pagini recente » Cod sursa (job #1085355) | Cod sursa (job #1211884) | Cod sursa (job #2547528) | Cod sursa (job #386921) | Cod sursa (job #1908890)
#include <fstream>
using namespace std;
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
unsigned int N, M;
unsigned int A[100001];
unsigned int x, y;
unsigned int RMQ[18][100001];
unsigned int log[100001];
unsigned int lg, range, diff;
unsigned int i, j;
unsigned int sol;
int main ()
{
fin >> N >> M;
for (i=1; i<=N; i++)
fin >> A[i];
for (i=2; i<=N; i++)
log[i] = log[i/2] + 1; /// log[i] - cum se scrie i ca 2 la o putere
for (i=1; i<=N; i++)
RMQ[0][i] = A[i]; /// Prima linie este vectorul A.
for (i=1; (1<<i)<=N; i++)
for (j=1; j<=N-(1<<i)+1; j++)
{
lg = 1<<(i-1);
RMQ[i][j] = min(RMQ[i-1][j],RMQ[i-1][j+lg]);
}
for (i=1; i<=M; i++)
{
fin >> x >> y;
range = y - x + 1; /// Number of elements from x to y.
lg = log[range];
diff = range - (1<<lg);
sol = min(RMQ[lg][x],RMQ[lg][x+diff]);
fout << sol << '\n';
}
return 0;
}