Pagini recente » Cod sursa (job #2565812) | Cod sursa (job #283475) | Cod sursa (job #2178953) | Cod sursa (job #649688) | Cod sursa (job #1443289)
#include <cstdio>
#include <vector>
using namespace std;
const int MAX = 100000;
vector<int> mat[18]; //log de MAX
int v[MAX], n, m, vlog[MAX];
void precalc();
void afis();
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int x, y, lin, sol;
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++)
scanf("%d", v + i);
precalc();
for(int i=1; i<=m; i++)
{
scanf("%d%d", &x, &y);
lin = vlog[y-x+1];
(v[mat[lin][x]] < v[mat[lin][y-(1<<lin)+1]]) ? sol = v[mat[lin][x]] : sol = v[mat[lin][y-(1<<lin)+1]];
printf("%d\n", sol);
}
//afis();
return 0;
}
void afis()
{
vector<int>::iterator it;
for(int i=0; i<=vlog[n]; i++)
{
for(it=mat[i].begin(); it!=mat[i].end(); ++it)
printf("%3d ", *it);
printf("\n");
}
}
void precalc()
{
int i, j;
for(i=2; i<=n; i++)
vlog[i] = 1 + vlog[i/2];
for(i=0; i<=vlog[n]; i++)
mat[i].push_back(0);
for(i=1; i<=n; i++)
mat[0].push_back(i);
for(i=1; i<=vlog[n]; i++)
{
for(j=1; j<=n-(1<<i)+1; j++)
{
if(v[mat[i-1][j]] < v[mat[i-1][j+(1<<(i-1))]])
mat[i].push_back(mat[i-1][j]);
else
mat[i].push_back(mat[i-1][j+(1<<(i-1))]);
}
}
}