Pagini recente » Cod sursa (job #384718) | Diferente pentru teorema-chineza-a-resturilor intre reviziile 61 si 89 | Monitorul de evaluare | Cod sursa (job #2802040) | Cod sursa (job #2754544)
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
const int value=100000;
int n,m;
const int logar=log(value)+1;
int input[value];
int sparse[value][6];
void preprocesare (int input[], int n)
{
for(int i=0;i<n;i++)
sparse[i][0]=i;
for(int j=1;pow(2,j)<=n;j++)
{
int pw2=pow(2,j-1);
for(int i=0;i+pow(2,j)-1<n;i++)
if(input[sparse[i][j-1]]
<input[sparse[i+pw2][j-1]])
sparse[i][j]=sparse[i][j-1];
else
sparse[i][j]=sparse[i+pw2][j-1];
}
}
int rmq(int st,int dr)
{ int l,k;
l = dr-st+1;
k = log(l);
int pw2=pow(2,k);
return min(input[sparse[st][k]],input[sparse[st+l-pw2][k]]);
}
int main()
{
int x,y;
f>>n>>m;
for(int i=0;i<n;i++)
f>>input[i];
preprocesare(input,n);
for(int i=0;i<m;i++)
{
f>>x>>y;
if(x!=y)
g<<rmq(x-1,y-1)<<endl;
}
return 0;
}