http://icpc.upc.edu.cn/problem.php?cid=1704&pid=1
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
const int maxn=2000005;
vector<int>a[maxn];
stack<int>s;
int dfn[maxn],i,n,x,ans,y,m,b[maxn],k1,in[maxn],k,t,low[maxn];
void tarjan(int x) {
t++;
dfn[x]=low[x]=t;
s.push(x);
in[x]=1;
for(int i=0; i<a[x].size(); i++)
if(!dfn[a[x][i]]) {
tarjan(a[x][i]);
low[x]=min(low[x],low[a[x][i]]);
} else if(in[a[x][i]]) {
low[x]=min(low[x],dfn[a[x][i]]);
}
if(low[x]==dfn[x]) {
k++;
while(1) {
k1=s.top();
s.pop();
in[k1]=0;
b[k1]=k;
if(k1==x)break;
}
}
}
int main() {
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++) {
scanf("%d",&k);
a[i].push_back(k+n);
a[k+n].push_back(i);
}
for(i=1; i<=m; i++) {
scanf("%d%d",&x,&y);
a[x].push_back(y);
a[y].push_back(x);
}
for(i=1; i<=n+n; i++)
if(!dfn[i])
tarjan(i);
for(i=1; i<=n; i++) {
if(b[i]==b[i+n]) ans++;
}
printf("%d\n",ans);
}