比赛 |
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;
}