Pagini recente » Cod sursa (job #1475434) | Cod sursa (job #2633401) | Cod sursa (job #1637566) | Cod sursa (job #440343) | Cod sursa (job #346170)
Cod sursa(job #346170)
/* <O(n log n) - PreProc >
<O(1) - Query >
*/
#define MAX 100005
#include<stdio.h>
int A[MAX];
int B[18][MAX];
int N;
int Pow2[50];
int contor;
int loglung;
int Q;
int st;
int fin;
int log2(int t)
{
int p = 1, count = 0;
while (p <= t)
{
p *= 2;
count++;
}
return count - 1;
}
void PreProc()
{
for(int i = 1; i <= N; i++)
B[0][i] = i;
for(int i = 1; i <= 17; i++)
{
for(int j = 1; j <= N; j++)
if (Pow2[i] + j <= N + 1)
{
if (A[B[i - 1][j]] < A[B[i - 1][j + Pow2[i-1] ]])
B[i][j] = B[i - 1][j];
else
B[i][j] = B[i - 1][j + Pow2[i-1]];
}
else
break;
}
}
int Init()
{
int p = 1;
while (p <= MAX)
{
Pow2[contor] = p;
contor++;
p *= 2;
}
}
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d %d",&N,&Q);
for(int i = 1; i <= N; i++)
scanf("%d",&A[i]);
Init();
PreProc();
for(int i = 1; i <= Q; i++)
{
scanf("%d %d",&st,&fin);
loglung = log2(fin - st + 1);
if (A[B[loglung][st]] < A[B[loglung][fin - Pow2[loglung] + 1]])
printf("%d\n",A[B[loglung][st]]);
else
printf("%d\n",A[B[loglung][fin - Pow2[loglung] + 1]]);
}
return 0;
}