Cod sursa(job #1193080)

Utilizator silvatheviprersilviu catioiu silvatheviprer Data 30 mai 2014 21:16:31
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.72 kb
#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;
}