Pagini recente » Cod sursa (job #1295054) | Cod sursa (job #2742815) | Cod sursa (job #3130407) | Cod sursa (job #2222828) | Cod sursa (job #3272144)
#include <fstream>
#include <algorithm>
#define dim 100000
using namespace std;
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
struct query
{
int l,r,pos;
};
query qry[10*dim+1];
int v[dim+1],stiva[dim+1],n,q,k,sol[10*dim+1];
bool cmp (query a,query b)
{
return a.r<b.r;
}
struct ds
{
int t[dim+1];
void init ()
{
for (int i=1; i<=n; i++)
t[i]=i;
}
int rad (int x)
{
if (x==t[x])
return x;
return t[x]=rad (t[x]);
}
void reun (int x,int y)
{
t[rad (x)]=y;
}
};
ds dsu;
int main()
{
fin>>n>>q;
dsu.init ();
for (int i=1; i<=n; i++)
fin>>v[i];
for (int i=1; i<=q; i++)
{
fin>>qry[i].l>>qry[i].r;
qry[i].pos=i;
}
sort (qry+1,qry+q+1,cmp);
int j=0;
for (int i=1; i<=q; i++)
{
while (j<qry[i].r)
{
j++;
while (k>0&&v[stiva[k]]>=v[j])
{
dsu.reun (stiva[k],j);
k--;
}
stiva[++k]=j;
}
sol[qry[i].pos]=v[dsu.rad (qry[i].l)];
}
for (int i=1; i<=q; i++)
fout<<sol[i]<<"\n";
return 0;
}