Pagini recente » Cod sursa (job #3127246) | Cod sursa (job #265170) | Cod sursa (job #606800) | Cod sursa (job #457230) | Cod sursa (job #1955210)
#include <fstream>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
struct el
{
int st,dr,val;
}a[300000];
int n,m,x,y;
void preprocesare(int poz,int st,int dr)
{
a[poz].st=st;
a[poz].dr=dr;
a[poz].val=1000000000;
if(st!=dr)
{
preprocesare(2*poz,st,(st+dr)/2);
preprocesare(2*poz+1,(st+dr)/2+1,dr);
}
}
void add(int i,int val)
{
int poz=1;
while(a[poz].st!=a[poz].dr)
{
a[poz].val=min(a[poz].val,val);
if(a[2*poz].dr>=i)
poz=2*poz;
else
poz=2*poz+1;
}
a[poz].val=val;
}
int getMin(int poz,int st,int dr)
{
if(a[poz].st>=st&&a[poz].dr<=dr)
return a[poz].val;
else
if(a[2*poz].dr<st)
return getMin(2*poz+1,st,dr);
else
if(a[2*poz+1].st>dr)
return getMin(2*poz,st,dr);
else
{
int x=getMin(2*poz,st,dr);
int y=getMin(2*poz+1,st,dr);
return min(x,y);
}
}
int main()
{
fin>>n>>m;
preprocesare(1,1,n);
for(int i=1;i<=n;i++)
{
fin>>x;
add(i,x);
}
for(int i=1;i<=m;i++)
{
fin>>x>>y;
fout<<getMin(1,x,y)<<"\n";
}
return 0;
}