Pagini recente » Cod sursa (job #3366013) | Autentificare | Cod sursa (job #3365621) | Cod sursa (job #3366015) | Cod sursa (job #3366469)
// rmq propriu-zis
#include <fstream>
#include <vector>
#include <climits>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
const int NMAX=100005;
int a[NMAX][21]; int logaritm[NMAX];
// a[i][j] i-pozitia de inceput
// i+2^j-1 -pozitia de final
// a[i][j] -minimul pe interval
int n,queries;
vector<int> v,sol;
void calc_log()
{
logaritm[1]=0;
for(int i=2;i<=n;i++){
logaritm[i]=logaritm[i-1];
if((1<<(logaritm[i]+1))<=i) logaritm[i]++;
}
}
int main()
{
cin>>n>>queries;
v.resize(n);
for(int i=0;i<n;i++) {
cin>>v[i];
a[i][0]=v[i];
}
calc_log();
for(int i=0;i<n;i++)
for(int j=1;j<=logaritm[i];j++) a[i][j]=INT_MAX;
for(int j=1;j<=20;j++)
for(int i=0;i<n;i++)
if(i+(1<<j)<=n)
a[i][j]=min(a[i][j-1],a[i+(1<<(j-1))][j-1]);
for(int i=0;i<queries;i++){
int left,right; cin>>left>>right; left--; right--;
int lg=logaritm[right-left+1];
int min1=a[left][lg];
int min2=a[right-(1<<lg)+1][lg];
sol.push_back(min(min1,min2));
}
for(int x:sol) cout<<x<<'\n';
return 0;
}