http://codeforces.com/problemset/problem/489/D
Solution:
#include<bits/stdc++.h> using namespace std ; //------------------------------- typedef long long ll ; typedef vector vi ; typedef pair ii ; //------------------------------- #define _CRT_SECURE_NO_WARNINGS #define pb(a) push_back(a) #define mp(a,b) make_pair(a,b) #define rep(i,a,b) for(int i=(a) ; (i)<(b) ; ++i) #define inf 2000000000 #define endl "\n" #define de(x) cerr<<#x<<" is "<<x<b) ? (a) : (b) ) #define min(a,b) ( (a<b) ? (a) : (b) ) //------------------------------ int ri() { char c = getchar(); while(c'9') c=getchar(); int ret = 0; while(c>='0' && c<='9') { ret=10*ret+c-48; c=getchar(); } return ret; } int n ; int m ; vi gr[3333] ; vi inp[3333] ; int u,v ; int go[3003][3003] ; mapmo ; int main() { //freopen("input.txt","r",stdin); n=ri(); m=ri() ; rep(i,0,m){ u=ri(); v=ri(); gr[u].pb(v) ; mo[mp(u,v)]=1; inp[v].pb(u) ; } rep(i,1,3003) if(inp[i].size()){ rep(j,0,inp[i].size()-1) rep(k,j+1,inp[i].size()){ go[ inp[i][j] ][ inp[i][k] ] += 1 ; go[ inp[i][k] ][ inp[i][j] ] += 1 ; } } ll ans = 0 ; rep(i,1,n+1) if(gr[i].size()) { rep(j,0,gr[i].size()-1) rep(k,j+1,gr[i].size()){ ans += go[gr[i][j]][gr[i][k]] ; if( mo[mp( gr[i][j],i)] && mo[mp( gr[i][k],i)] ) ans--; } } printf("%lld",ans); }