graph gv,gw; int a[1d5],b[1d5],c[1d5],d[1d5]; int vc[1d5+1],wc[1d5+1]; int vd[1d5+1],wd[1d5+1]; set aset; { int @n,@v,@w; rd((a,b)(v),(c,d)(w)); gv.setEdge(n+1,v,a,b); gw.setEdge(n+1,w,c,d); gv.scc(vc); gw.scc(wc); ll z=-n; for(int i=1;i<=n;++i){ vd[vc[i]]+=1; wd[wc[i]]+=1; } for(int i=1;i<=n;++i){ int vi=vc[i]; int wi=wc[i]; ll k=(ll)vi<<32|wi; if(aset.find(k)==aset.end()){ aset.insert(k); z+=(ll)vd[vi]*wd[wi]; } } wt(z); }