Cod sursa(job #4800)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 7 ianuarie 2007 13:50:41
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.49 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;
}