Pagini recente » Cod sursa (job #1595367) | Monitorul de evaluare | Cod sursa (job #2431594) | Cod sursa (job #333919) | Cod sursa (job #1840598)
#include <iostream>
#include <fstream>
#include <cmath>
#define Nmax 100010
#define Logmax 18
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int n,m,a[Nmax],rmq[Nmax][Logmax],lg[Nmax];
void process()
{
int k;
for(int i=1;i<=n;i++)
rmq[i][0]=a[i];
for(int j=1; 1<<j <=n;j++)
{
for(int i=1; i+ (1<<j)-1 <=n;i++)
{
k=1<<(j-1);
rmq[i][j]=min(rmq[i][j-1],rmq[i+k][j-1]);
}
}
}
int query(int x,int y)
{
int diff=y-x+1;
int l=lg[diff];
int sh=diff - (1<<l);
return min(rmq[x][l],rmq[x+sh][l]);
}
int main()
{
f >> n >> m;
for(int i=1;i<=n;i++)
{
f >> a[i];
}
lg[1]=0;
for(int i=2;i<=n;i++)
lg[i]=lg[i/2]+1;
process();
int x,y;
for(int i=0;i<m;i++)
{
f >> x >> y;
g << query(x,y) << "\n";
}
return 0;
}