Pagini recente » Cod sursa (job #3288606) | Utilizatori inregistrati la preONI 2007, Runda 1, Clasa a 9-a si gimnaziu | Cod sursa (job #999850) | Cod sursa (job #1142847) | Cod sursa (job #3295788)
/*
RMQ-RANGE MINIMUM QUERY
*/
#include<iostream>
using namespace std;
const int NMAX=1e5;
int rmq[NMAX+1][17];
int v[NMAX+1];
//RMQ[i][j]=minimul secventei care incepe la pozitia i si are lungimea 2^j
/*
RMQ[i][j]=min(v[i],...,v[i+2^j-1])
1 5 6 4 3
RMQ[i][j]=min(RMQ[i][j-1],RMQ[i+2^(j-1)][j-1])
RMQ[1][0]=1 RMQ[1][1]=1 RMQ[1][2]=1
RMQ[2][0]=5 RMQ[2][1]=5 RMQ[2][2]=3
RMQ[3][0]=6 RMQ[3][1]=4 RMQ[3][2]=3
RMQ[4][0]=4 RMQ[4][1]=3 RMQ[4][2]=3
RMQ[5][0]=3 RMQ[5][1]=3 RMQ[5][2]=3
[3,9]=[3,6]U[7,8]U[9,9]
[3,9]=[3,6]U[6,9]
*/
int query_1(int x, int y)
{
int len=y-x+1;
int p=log2(len);
//[x,y]=[x,x+2^p-1]U[y-2^p+1,y]
return min(rmq[x][p],rmq[y-(1<<p)+1][p]);
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>v[i];
}
//initializam coloana 0 din rmq cu valorile din vector
for(int i=1;i<=n;i++)
{
rmq[i][0]=v[i];
}
for(int j=1;j<=int(log2(n));j++)
{
for(int i=1;i<=n-(1<<j)+1;i++){
rmq[i][j]=min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
}
}
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
cout<<query_1(x,y)<<endl;
}
}