Pagini recente » Cod sursa (job #3366447) | Cod sursa (job #3366022) | Cod sursa (job #3366731) | Cod sursa (job #3366050) | Cod sursa (job #3366461)
// 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];
// 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;
int power(int nr)
{
int p=1;
while(p*2<=nr) p*=2;
return p;
}
int main()
{
cin>>n>>queries;
v.resize(n);
for(int i=0;i<n;i++) {
cin>>v[i];
a[i][0]=v[i];
}
for(int i=0;i<n;i++)
for(int j=1;j<=20;j++) a[i][j]=INT_MAX;
for(int i=0;i<n;i++)
for(int j=1;j<=20;j++)
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 p=power(right-left+1);
int log=0;
while(p>1){
log++;
p>>=1;
}
int min1=a[left][log];
int min2=a[right-(1<<log)+1][log];
sol.push_back(min(min1,min2));
}
for(int x:sol) cout<<x<<'\n';
return 0;
}