Pagini recente » Cod sursa (job #2238645) | Cod sursa (job #393691) | Cod sursa (job #242053) | Cod sursa (job #1994880) | Cod sursa (job #2124757)
#include <iostream>
#include <fstream>
#include <climits>
#define inf INT_MAX
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int n, v[1000001], arb[10000001], m, q[10000001];
void build(int st, int dr, int nod)
{
if(st<dr)
{
int mij=(st+dr)/2;
build(st, mij, 2*nod);
build(mij+1, dr, 2*nod+1);
arb[nod]=min(arb[2*nod], arb[2*nod+1]);
}
else
arb[nod]=v[st];
}
int query(int st, int dr, int x, int y, int nod)
{
//cout<<nod<<" "<<st<<" "<<dr<<endl;
if(x<=st && y>=dr)
{
// cout<<st<<" "<<dr<<" "<<nod<<" "<<arb[nod]<<endl;
return nod;
}
else
if(!(y<st || x>dr))
{
int mij=(st+dr)/2;
int rez1=query(st, mij, x, y, 2*nod);
int rez2=query(mij+1, dr, x, y, 2*nod+1);
//cout<<"HERE ";
if(rez1==rez2 && rez1==inf)
return inf;
else if(rez1==inf && rez2!=inf)
return rez2;
else if(rez2==inf && rez1!=inf)
return rez1;
else
if(arb[rez1]<arb[rez2])
{
//cout<<rez1<<endl;
return rez1;
}
else if(arb[rez1]>arb[rez2]){
//cout<<rez2<<endl;
return rez2;
}
}
else return inf;
}
int main()
{
int x, y;
f>>n>>m;
for(int i=1; i<=n; i++)
f>>v[i];
build(1, n, 1);
for(int i=1; i<=m; i++)
{
f>>x>>y;
g<<arb[query(1, n, x, y, 1)]<<'\n';
}
/*for(int i=1; i<=2*n-1; i++)
cout<<arb[i]<<" ";*/
return 0;
}