比赛 20140307 评测结果 AWWEEEEEEE
题目名称 Bessie洗牌法 最终得分 10
用户昵称 雪狼 运行时间 0.523 s
代码语言 C++ 内存使用 1.65 MiB
提交时间 2014-03-07 21:24:37
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#define maxn 10000+10
#define REP(i,a,b) for(int i=a;i!=b+1;++i)
#define uREP(i,a,b) for(int i=a;i!=b-1;--i)
#define CLR(c,x) memset(c,x,sizeof(c))
#define INF ~0U>>2
#define eps 1e-9

using namespace std;

int n,m,q;
int nxt[maxn][35];

void read(){
	scanf("%d%d%d",&n,&m,&q);
	REP(i,1,m)scanf("%d",&nxt[i][0]),nxt[i][0]--;
}

void init(){
	REP(k,1,30)REP(i,1,m)
		nxt[i][k]=nxt[nxt[i][k-1]][k-1];	
}

int find(int y,int k){
	for(int j=0;k;j++,k>>=1 )					
	if(k&1)y=nxt[y][j];
	return y;
}

void solve(){
	int y,k,s,j;
	int cnt;
	while(q--){
		scanf("%d",&s);
		cnt = 0;
		if(s>m)y=m,cnt+=(s-m); 
		else y=s;		  
				
		uREP(k,30,0)if(nxt[y][k]){
			y=nxt[y][k];
			cnt+=(1<<k);
		}

		if(cnt>n-m){
			if(s>m)y=find(m,n-m+1-(s-m));
			else y=find(s,n-m+1);
			printf("%d\n",m-y);
		}
		else
			printf("%d\n",n-cnt);
	}	
}

void setIO(string s){
	string in=s+".in",out=s+".out";
	freopen(in.c_str(),"r",stdin);
	freopen(out.c_str(),"w",stdout);
}

int main(){
	setIO("shufflegold");
	read();
	init();
	solve();
	return 0;
	
}