Pagini recente » Cod sursa (job #1826299) | Cod sursa (job #850029) | Cod sursa (job #2131046) | Cod sursa (job #1449996) | Cod sursa (job #2465499)
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int numax=100005;
int v[100005];
int w[10000];
int n,m,divizare;
int minim(int a,int b)
{
if(a<b)
return a;
return b;
}
int functie_stabilere_inceput(int a)
{
int j=a/divizare+1,minimum=numax;
while(a/divizare!=j)
{
minimum=minim(v[a],minimum);
a++;
}
return minimum;
}
int functie_stabilere_sfarsit(int b)
{
int j=b/divizare-1,minimum=numax;
while(b/divizare!=j)
{
minimum=minim(v[b],minimum);
b--;
}
return minimum;
}
int functie_stabilere_mijloc(int inceput,int sfarsit)
{
int minimum=numax;
for(int i=inceput;i<=sfarsit;i++)
minimum=minim(minimum,w[i]);
return minimum;
}
int functie_minim(int a,int b)
{
int inceput, sfarsit,inainte,mijloc,dupa;
if(a/divizare==(a-1)/divizare)
{
inainte=functie_stabilere_inceput(a);
inceput=a/divizare+1;
}
else
{
inceput=a/divizare;
}
if(b/divizare==(b+1)/divizare)
{
dupa=functie_stabilere_sfarsit(b);
sfarsit=b/divizare-1;
}
else
{
sfarsit=b/divizare;
}
mijloc=functie_stabilere_mijloc(inceput,sfarsit);
return minim(inainte,minim(mijloc,dupa));
}
int main()
{
int i,j,x,y;
fin>>n>>m;
divizare=sqrt(n);
for(i=0;i<=divizare+1;i++)
w[i]=numax;
for(i=1;i<=n;i++)
{
fin>>v[i];
j=i/divizare;
w[j]=minim(w[j],v[i]);
}
for(i=1;i<=m;i++)
{
fin>>x>>y;
fout<<functie_minim(x,y)<<"\n";
}
return 0;
}