Pagini recente » Cod sursa (job #13457) | Cod sursa (job #1604759) | Cod sursa (job #273993) | Cod sursa (job #1521577) | Cod sursa (job #1637918)
#include<fstream>
#include<cmath>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int MaxN = 100111;
const int SqrtMaxN = 350;
#define INF 0x3f3f3f3f
int N, M;
int v[MaxN];
int SN;
int fasie[MaxN/SqrtMaxN];
int query(int l, int r)
{
int minim =INF;
int pozs;
for(int i=1;i<=N/SN;++i)
{
if(i*SN>=l && (i+1)*SN-1<=r)
{
if(minim>fasie[i])
{
minim =fasie[i];
}
pozs=(i*1)*SN-2;
}
}
if(l%SN != 0)
{
for(;l<=r && l%SN!=0;++l)
{
if(minim > v[l])
{
minim = v[l];
}
}
}
if(r%SN !=0 )
{
for(;pozs<=r;pozs++)
{
if(minim>v[pozs])
minim =v[pozs];
}
}
return minim;
}
int main()
{
fin>>N>>M;
SN=sqrt(N);
for(int i=1;i<=N;i++)
fin>>v[i];
for(int i=1;i<=N/SN;++i)
{
fasie[i] = INF;
}
for(int i=1;i<=N;++i)
{
int indice_fasie = i/SN;
if (fasie[indice_fasie] > v[i])
{
fasie[indice_fasie] = v[i];
}
}
for(int i=1;i<=M;++i)
{
int l, r;
fin>>l>>r;
fout<<query(l, r)<<"\n";
}
}