Pagini recente » Cod sursa (job #2065168) | Cod sursa (job #1295134) | Cod sursa (job #2571843) | Cod sursa (job #1587129) | Cod sursa (job #1147197)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("rmq.in");
ofstream out ("rmq.out");
int N,M,a[100001],m[200001],s,d;
void arbore(int nod,int st,int dr)
{
if (st==dr) m[nod]=st;
else
{
arbore (2*nod,st,(st+dr)/2); arbore (2*nod+1,(st+dr)/2+1,dr);
if (a[m[2*nod]]<a[m[2*nod+1]]) m[nod]=m[2*nod];
else m[nod]=m[2*nod+1];
}
}
int rmq(int nod, int st,int dr)
{
if (s>dr||st>d) return -1;
if (s<=st&&dr<=d) return m[nod];
int p1,p2;
p1=rmq(2*nod,st,(st+dr)/2);
p2=rmq(2*nod+1,(st+dr)/2+1,dr);
if (p1 == -1)
return p2;
if (p2 == -1)
return p1;
if (a[p1] <= a[p2])
return p1;
return p2;
}
int main()
{
in>>N>>M;
int i;
for (i=0;i<N;i++) in>>a[i];
arbore(1,0,N-1);
for (i=1;i<=M;i++)
{
in>>s>>d; s--; d--;
out<<a[rmq(1,0,N-1)]<<endl;
}
return 0;
}