Pagini recente » Cod sursa (job #2220081) | Cod sursa (job #1822308) | Cod sursa (job #2396727) | Cod sursa (job #1221099) | Cod sursa (job #2922230)
//varianta arbori intervale cu alocare dinamica
//Arseni Costel, Colegiul National Mihail Sadoveanu Pascani
//Costel Ionut pe facebook :))))
#include<fstream>
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
struct nod
{
int info=(1<<30);
nod *st,*dr;
};
int minim;
void actualizare(nod *&rad,int val,int st,int dr,int pos)
{
if(rad==NULL)
{
rad=new nod;
rad->st=NULL;
rad->dr=NULL;
}
if(st==dr)
{
rad->info=val;
return;
}
int mij=(st+dr)/2;
if(pos<=mij)
{actualizare(rad->st,val,st,mij,pos);}
else
{actualizare(rad->dr,val,mij+1,dr,pos);}
if(rad->st==NULL)
rad->info=rad->dr->info;
else if(rad->dr==NULL)
rad->info=rad->st->info;
else
rad->info=min(rad->st->info,rad->dr->info);
}
void interogare(nod*rad,int st,int dr,int start,int finish)
{
if(start<=st&&dr<=finish)
{
if(minim>rad->info)
minim=rad->info;
return ;
}
int mij=(st+dr)/2;
if(start<=mij)
interogare(rad->st,st,mij,start,finish);
if(mij<finish)
interogare(rad->dr,mij+1,dr,start,finish);
}
int main()
{
int n,m,x,y,z;
cin>>n>>m;
nod*rad=NULL;
for(int i=1;i<=n;i++)
{
cin>>x;
actualizare(rad,x,1,n,i);
}
for(;m;m--)
{
cin>>y>>z;
minim=1<<30;
interogare(rad,1,n,y,z);
cout<<minim<<'\n';
}
}