#include using namespace std; typedef long long ll; #define REP(i,n) for(int i=0,_n=(int)(n);i<_n;++i) #define ALL(v) (v).begin(),(v).end() #define CLR(t,v) memset(t,(v),sizeof(t)) templateostream& operator<<(ostream& os,const pair&a){return os<<"("<void pv(T a,T b){for(T i=a;i!=b;++i)cout<<(*i)<<" ";cout<void chmin(T&a,const T&b){if(a>b)a=b;} templatevoid chmax(T&a,const T&b){if(a g[MAX_N]; vector r[MAX_N]; int sccid[MAX_N]; int sccnum; void dfs(int p, vector& order) { if (sccid[p] != 0) return; sccid[p] = 1; for (int i : g[p]) dfs(i, order); order.push_back(p); } void rdfs(int p, int id) { if (sccid[p] != -1) return; sccid[p] = id; for (int i : r[p]) rdfs(i, id); } void scc(int N) { vector order; CLR(sccid, 0); REP(i, N) dfs(i, order); CLR(sccid, -1); sccnum = 0; for (int i = (int)order.size() - 1; i >= 0; i--) if (sccid[order[i]] == -1) { rdfs(order[i], sccnum); sccnum++; } } // 座標圧縮 vector rev; // 圧縮後の値から元の値への写像 vector normalize(const vector v) { const int N = v.size(); vector res(N); vector > t(N); rev = vector(N); REP(i, N) t[i] = { v[i], i }; sort(ALL(t)); int r = 0; REP(i, N) { r += (i > 0 && t[i - 1].first != t[i].first); res[t[i].second] = r; rev[r] = t[i].first; } rev.erase(rev.begin() + r + 1, rev.end()); return res; } int main2() { REP(i, MAX_N) g[i].clear(); REP(i, MAX_N) r[i].clear(); int N = nextLong(); int M = nextLong(); vector es_row(2 * M); REP(i, M) { int a = nextLong(); int b = nextLong(); es_row[2 * i ] = a; es_row[2 * i + 1] = b; } auto es = normalize(es_row); // pv(ALL(rev)); ll ans = (ll)(N+1)*N/2; for (auto x : set(ALL(es_row))) { ans -= x; } REP(i, M) { int a = es[i * 2]; int b = es[i * 2 + 1]; g[a].push_back(b); r[b].push_back(a); } int V = rev.size(); scc(V); vector> gg(sccnum); vector scc_size(sccnum); vector scc_max(sccnum); REP(i, V) { scc_size[sccid[i]]++; for (int j : g[i]) { if (sccid[i] != sccid[j]) gg[sccid[i]].push_back(sccid[j]); } chmax(scc_max[sccid[i]], rev[i]); } REP(s, sccnum) { sort(ALL(gg[s])); gg[s].erase(unique(ALL(gg[s])), gg[s].end()); // cout << s << " : "; pv(ALL(gg[s])); } // cout << "size: "; pv(ALL(scc_size)); // cout << "max: "; pv(ALL(scc_max)); for (int s = sccnum - 1; s >= 0; s--) { for (int nxt : gg[s]) { chmax(scc_max[s], scc_max[nxt]); } ans += scc_max[s] * scc_size[s]; } cout << ans << endl; return 0; } int main() { #ifdef LOCAL for (;!cin.eof();cin>>ws) #endif main2(); return 0; }