Pagini recente » Cod sursa (job #372679) | Cod sursa (job #1250731) | Rating Dan Deac (Dandeac) | Cod sursa (job #1743417) | Cod sursa (job #2522545)
#include <bits/stdc++.h>
#define N_MAX 100005
using namespace std;
int n, q, i, val, j, A, B, k, length, aux1, aux2, logaritm[N_MAX], v[N_MAX], a[N_MAX][20], cont, paw2[20];
void pawtwo()
{
paw2[0] = 1;
for(int i = 1; i <= 20; i ++)
paw2[i] = 2 * paw2[i - 1];
}
void pre_calc_log()
{
int val = 1;
for(int i = 1; val * 2 <= N_MAX; i ++)
{
val = val * 2;
logaritm[val] ++;
}
for(int i = 1; i <= N_MAX; i ++)
logaritm[i] = logaritm[i] + logaritm[i - 1]; //Smenul lui Mars pentru a precalcula parte intreaga din log(x)
}
int main()
{
pre_calc_log();
pawtwo();
ifstream f("rmq.in");
ofstream g("rmq.out");
f >> n >> q;
for(i = 1; i <= n; i ++)
f >> v[i];
for(i = 1; i <= n; i ++)
a[i][0] = i;
val = 1;
cont = 1;
for(j = 1; j <= logaritm[n]; j ++)
{
for(i = 1;i + cont <= n; i ++)
{
aux1 = a[i][j - 1];
aux2 = a[i + val][j - 1];
if(v[aux1] < v[aux2])a[i][j] = aux1;
else a[i][j] = aux2;
}
val = val * 2;
cont = cont + val;
}
for(i = 1; i <= q; i ++)
{
f >> A >> B;
length = B - A + 1;
k = logaritm[length];
aux1 = a[A][k];
aux2 = a[A + length - paw2[k]][k];
if(v[aux1] < v[aux2])g << v[aux1] << "\n";
else g << v[aux2] << "\n";
}
return 0;
}