Pagini recente » Cod sursa (job #2909665) | Cod sursa (job #2944777) | Cod sursa (job #2507483) | Cod sursa (job #2943229) | Cod sursa (job #2096770)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fi("rmq.in");
ofstream fo("rmq.out");
int N,A[100001];
int M;
int LG[100001];
int p,k;
int Table[100001][18];
int main()
{
fi>>N>>M;
for (int i=1;i<=N;i++)
fi>>A[i];
/// se construieste sirul LG
LG[1]=1;
p=1;
k=1;
while (2*p<=N)
{
LG[2*p]=k+1;
p=p*2;
k++;
}
for (int i=1;i<=N;i++)
if (LG[i]==0)
LG[i]=LG[i-1];
for (int i=1;i<=N;i++)
LG[i]--;
/// se construieste Table
for (int i=1;i<=N;i++)
Table[i][0]=A[i];
k--;
for (int j=1;j<=k;j++)
for (int i=1;i<=N-(1<<j)+1;i++)
Table[i][j]=min(Table[i][j-1],Table[i+(1<<(j-1))][j-1]);
/// se citesc intrebarile si se raspunde la fiecare din ele
for (int q=1;q<=M;q++)
{
int st,dr,lung,length,rezst,rezdr;
fi>>st>>dr;
lung=dr-st+1;
length=1<<LG[lung];
rezst=Table[st][LG[lung]];
rezdr=Table[dr-length+1][LG[lung]];
fo<<min(rezst,rezdr)<<"\n";
}
fi.close();
fo.close();
return 0;
}