Pagini recente » Istoria paginii runda/48000 | Cod sursa (job #2225796) | Cod sursa (job #1052492) | Cod sursa (job #1986785) | Cod sursa (job #350660)
Cod sursa(job #350660)
#include <stdio.h>
#define N 1<<17
#define M 1<<5
int n,m,x,y,l;
int v[N],lg[N],rmq[M][N];
/*
rmq[i][j]=cel mai mic elem din subescventa j+2^i-1
*/
inline int min(int a,int b)
{
if (a<b)
return a;
return b;
}
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d%d",&n,&m);
int i,j,t,k;
for (i=1; i<=n; i++)
{
scanf("%d",&v[i]);
lg[i]=i>=2 ? lg[i/2]+1 : 0;//calculez lg in baza 2 din i
rmq[0][i]=v[i];
}
for (i=1; (1<<i)<=n; i++)
{
t=1<<i;
k=1<<(i-1);
//fac minimul pe jumatati de interval
for (j=1; j<=n-t+1; j++)
rmq[i][j]=min(rmq[i-1][j],rmq[i-1][(j+t-1)-k+1]);
}
for (i=1; i<=m; i++)
{
scanf("%d%d",&x,&y);
l=lg[y-x+1];
t=1<<l;
printf("%d\n",min(rmq[l][x],rmq[l][y-t+1]));
/*fach minimul dintre minimele intervalelelor :
1. (x,x+2^l-1)
2. (y-x^l+1, y)*/
}
return 0;
}