Pagini recente » Cod sursa (job #1965860) | Cod sursa (job #1810109) | Cod sursa (job #1747783) | Cod sursa (job #967809) | Cod sursa (job #3224984)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n,m;
int a[18][100005];
int ex[100005];//exponentul celei mai mari puteri de 2 mai mică sau egală cu i
//prin folosirea algoritmului rmq in matrice pe poz p,i
//vom avea min din secventa ce incepe pe poz i si lungime 2^p
void rmq()
{
int i,j,poz;
for(i=1;(1<<i)<=n;i+=1)
for(j=1;j<=n;j+=1)
{
a[i][j]=a[i-1][j];
poz=j+(1<<(i-1));
if(poz<=n and a[i-1][poz]<a[i][j])
a[i][j]=a[i-1][poz];
}
int e=0;
ex[1]=0;
for(i=2;i<=n;i+=1)
{
if(1<<(e+1)<=i)
ex[i]=e+1,e+=1;
else
ex[i]=e;
}
/*
for(i=0;(1<<i)<=n;i+=1)
{
for(j=1;j<=n;j+=1)
fout<<a[i][j]<<' ';
fout<<endl;
}
for(i=1;i<=n;i+=1)
fout<<ex[i]<<' ';
*/
}
void in()
{
fin>>n>>m;
int i;
for(i=1;i<=n;i+=1)
fin>>a[0][i];
rmq();
int x,y,lin,sar;
for(i=1;i<=m;i+=1)
{
fin>>x>>y;
lin=ex[y-x+1];
sar=(1<<lin);
fout<<min(a[lin][x],a[lin][y-sar+1])<<'\n';
}
}
int main()
{
in();
return 0;
}