Pagini recente » Cod sursa (job #972354) | Cod sursa (job #618189) | Cod sursa (job #2815882) | Cod sursa (job #128207) | Cod sursa (job #1179424)
#include<fstream>
#define Next (++pos==100)?(fin.read(Buffer,100),pos = 0):0
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n,q,a[100005],mat[100005][20],puteri[25],pos;
short logaritm[100005];
char Buffer[100];
inline void Read(int &x)
{
while(Buffer[pos]<'0' || '9'<Buffer[pos])
Next;
x = 0;
while('0'<=Buffer[pos] && Buffer[pos]<='9')
{
x = x*10 +Buffer[pos]-'0';
Next;
}
}
inline void Citire()
{
int i;
fin.read(Buffer,100);
Read(n);Read(q);
for (i=1;i<=n;i++)
Read(a[i]);
}
inline void Init()
{
int i;
logaritm[2]=1;
for (i=3;i<=n;i++)
logaritm[i]=logaritm[i>>1]+1;
puteri[0]=1;
puteri[1]=2;
for (i=2;i<=20;i++)
puteri[i]=puteri[i-1]<<1;
}
inline void DP()
{
int i,aux,putere,st,dr;
mat[n][0]=a[n];
for (i=n-1;i>=1;i--)
{
mat[i][0]=min(a[i],a[i+1]);
aux=n-i+1;
putere=2;
while (putere<=aux)
{
mat[i][logaritm[putere]]=min(mat[i][logaritm[putere]-1],mat[i+puteri[logaritm[putere]-1]][logaritm[putere]-1]);
putere<<=1;
}
}
for (i=1;i<=q;i++)
{
Read(st);Read(dr);
aux=dr-st;
if (st==dr) fout<<a[st];
else fout<<min(mat[st][logaritm[aux]],mat[dr-puteri[logaritm[aux]]][logaritm[aux]]);
fout<<"\n";
}
}
int main()
{
Citire();
Init();
DP();
return 0;
}