Pagini recente » Cod sursa (job #2341007) | Cod sursa (job #3225393) | Cod sursa (job #635859) | Cod sursa (job #1312665) | Cod sursa (job #1193080)
#include<fstream>
#define Nmax 350000
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
struct nod
{
int x;
int y;
};
struct ask
{
int x;
int k;
int ord;
int ans;
};
nod v[Nmax];
ask query[Nmax];
int n,m,vf,adr[Nmax],st[Nmax];
void qsort(int st,int dr)
{
int i,j,m;
i=st;
j=dr;
m=v[(i+j)/2].x;
do
{
while (v[i].x<m) ++i;
while (v[j].x>m) --j;
if (i<=j)
{
swap(v[i].x,v[j].x);
swap(v[i].y,v[j].y);
++i;
--j;
}
}
while (i<j);
if (i<dr) qsort(i,dr);
if (j>st) qsort(st,j);
}
void qsort1(int st,int dr)
{
int i,j,m;
i=st;
j=dr;
m=query[(i+j)/2].x;
do
{
while (query[i].x<m) ++i;
while (query[j].x>m) --j;
if (i<=j)
{
swap(query[i].x,query[j].x);
swap(query[i].k,query[j].k);
swap(query[i].ord,query[j].ord);
++i;
--j;
}
}
while (i<j);
if (i<dr) qsort1(i,dr);
if (j>st) qsort1(st,j);
}
void qsort2(int st,int dr)
{
int i,j,m;
i=st;
j=dr;
m=query[(i+j)/2].ord;
do
{
while (query[i].ord<m) ++i;
while (query[j].ord>m) --j;
if (i<=j)
{
swap(query[i].ord,query[j].ord);
swap(query[i].ans,query[j].ans);
++i;
--j;
}
}
while (i<j);
if (i<dr) qsort2(i,dr);
if (j>st) qsort2(st,j);
}
int srch(int st,int dr,int nod)
{
int m;
if (st>dr) return -1;
else
{
m=(st+dr)/2;
if (query[m].x==nod)
{
if (query[m-1].x!=nod) return m;
else return srch(st,m-1,nod);
}
else if (nod<query[m].x) return srch(st,m-1,nod);
else return srch(m+1,dr,nod);
}
}
void df(int nod)
{
int i,poz,p;
st[++vf]=nod;
poz=srch(1,m,nod);
if (poz!=-1)
for (i=poz; query[i].x==nod; ++i)
{
p=vf-query[i].k;
if (p<0) p=0;
query[i].ans=st[p];
}
for (i=adr[nod]; v[i].x==nod && i; ++i)
df(v[i].y);
--vf;
}
int main()
{
int i;
f>>n>>m;
for (i=1; i<=n; ++i)
{
v[i].y=i;
f>>v[i].x;
}
for (i=1; i<=m; ++i)
{
query[i].ord=i;
f>>query[i].x>>query[i].k;
}
qsort(1,n);
qsort1(1,m);
for (i=1; i<=n; ++i)
if (!adr[v[i].x]) adr[v[i].x]=i;
df(0);
qsort2(1,m);
for (i=1; i<=m; ++i) g<<query[i].ans;
return 0;
}