Pagini recente » Cod sursa (job #54466) | Cod sursa (job #1025956) | Cod sursa (job #1678699) | Monitorul de evaluare | Cod sursa (job #370428)
Cod sursa(job #370428)
#include<stdio.h>
#define infile "rmq.in"
#define outfile "rmq.out"
#define nmax (100*1001)
#define lmax 17
int rmq[lmax][nmax]; //valorile range-ului
int lg[nmax]; //lg[i]=logaritm in baza 2 din i
int v[nmax]; //vectorul cu numerele
int n; //numarul de numere
int m; //numaru de query-uri
inline int min(int a, int b)
{
if(a<b) return a; return b;
}
int query(int a, int b)
{
int k=lg[b-a+1];
return min(rmq[k][a],rmq[k][b-(1<<k)+1]);
}
void read()
{
int i;
scanf("%d %d\n",&n,&m);
for(i=1;i<=n;i++)
scanf("%d\n",&v[i]);
}
void init()
{
int i,j;
//facem vectorul logaritmilor
for(i=2;i<=n;i++)
lg[i]=lg[i/2]+1;
//initializam rmq
for(i=1;i<=n;i++)
rmq[0][i]=v[i];
//construim intreg rmq-ul
for(i=1;(1<<i)<=n;i++)
for(j=1;j+(1<<i)-1<=n;j++)
rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
}
void solve()
{
int i,a,b;
for(i=1;i<=m;i++)
{
scanf("%d %d\n",&a,&b);
printf("%d\n",query(a,b));
}
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
read();
init();
solve();
fclose(stdin);
fclose(stdout);
return 0;
}