Cod sursa(job #1193079)

Utilizator silvatheviprersilviu catioiu silvatheviprer Data 30 mai 2014 21:08:03
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.06 kb
#include<stdio.h>
#define fin "stramosi.in"
#define fout "stramosi.out"
#define Nmax 350000
struct nod { int x; int y; }; // x - > 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];

FILE *in,*out;

void swap(int &a,int &b) { int aux; aux=a; a=b; b=aux; }

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 search(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 search(st,m-1,nod);
        }
        else
            if (nod<query[m].x) return search(st,m-1,nod);
            else return search(m+1,dr,nod);
    }
}

void df(int nod) {
int i,poz,p;
    st[++vf]=nod;

    poz=search(1,m,nod);

    //printf("%i: %i\n",nod,poz);

    if (poz!=-1)
        for (i=poz;query[i].x==nod;++i) {
            p=vf-query[i].k;
            if (p<0) p=0;
            //printf("%i ",st[p]);
            query[i].ans=st[p];
        }

    //for (int j=1;j<=vf;++j) printf("%i ",st[j]);

    //printf("\n");

    for (i=adr[nod];v[i].x==nod && i;++i)
        df(v[i].y);

    --vf;
}

int main() {
int i;
    freopen(fin,"r",stdin); freopen(fout,"w",stdout);

    scanf("%i%i",&n,&m);

    for (i=1;i<=n;++i) {
        v[i].y=i;
        scanf("%i",&v[i].x);
    }
    for (i=1;i<=m;++i) {
        query[i].ord=i;
        scanf("%i%i",&query[i].x,&query[i].k);
    }

    qsort(1,n);
    qsort1(1,m);

    //for (i=1;i<=n;++i) printf("%i %i\n",v[i].x,v[i].y);
    //for (i=1;i<=m;++i) printf("%i %i %i\n",query[i].x,query[i].k,query[i].ord);

    for (i=1;i<=n;++i)
        if (!adr[v[i].x]) adr[v[i].x]=i;
    /*
    for (i=0;i<=n;++i) printf("%i ",adr[i]);
    */
    df(0);

    qsort2(1,m);

    for (i=1;i<=m;++i) printf("%i\n",query[i].ans);

    fclose(stdin); fclose(stdout);
    return 0;
}