Pagini recente » Cod sursa (job #3132238) | Cod sursa (job #1294387) | Cod sursa (job #3179980) | Cod sursa (job #1941700) | Cod sursa (job #573632)
Cod sursa(job #573632)
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n,m,a[100015],rmq[20][100015],k,i,j,x,y,p;
void preg_rmq() {
for(i=0;i<n;i++) {
rmq[0][i]=i;
}
for(j=1; (1<<j)<=n;j++) {
for(i=0;i+ (1<<j)-1<n;i++) {
// cout<<"rmq["<<j<<"]["<<i<<"] dintre rmq["<<j-1<<"]["<<i<<"] ("<<a[rmq[j-1][i]]<<") si rmq[";
// cout<<j-1<<"]["<<i+(1<<(j-1))<<"] ("<<a[rmq[j-1][i+(1<<(j-1))]]<<")\n";
if ( a[ rmq[j-1][i] ] < a[ rmq[j-1][i+(1<<(j-1))] ] )
rmq[j][i]=rmq[j-1][i];
else
rmq[j][i]=rmq[j-1][i+(1<<(j-1))];
}
}
}
int query(int x, int y) {
k=(int) (log(y-x+1)/log(2));
if (a[ rmq[k][x] ] <= a[ rmq[k][y- (1<<k) +1] ]) return rmq[k][x];
return rmq[k][y- (1<<k) +1];
}
int main()
{
fin>>n>>m;
for(i=0;i<n;i++) {
fin>>a[i];
}
preg_rmq();
for(i=1;i<=m;i++) {
fin>>x>>y;
fout<<a[query(x-1,y-1)]<<"\n";
}
fout.close();
return 0;
}