using System; using static System.Console; using System.Linq; using System.Collections.Generic; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray(); public static void Main() { Solve(); } static void Solve() { var c = NList; var (n, m) = (c[0], c[1]); var map = NArr(n); WriteLine(Seg(n, m, map)); } static long Seg(int n, int m, int[][] map) { for (var i = 0; i < n; ++i) if (map[i][0] > map[i][1]) (map[i][0], map[i][1]) = (map[i][1], map[i][0]); Array.Sort(map, (l, r) => l[0].CompareTo(r[0])); var set = new HashSet(); foreach (var edge in map) { set.Add(edge[0]); set.Add(edge[1]); } var slist = new List(set); slist.Sort(); var dic = new Dictionary(); for (var i = 0; i < slist.Count; ++i) dic[slist[i]] = i; var p = new int[n * 2]; var div = 400; var dlist = new List>(); for (var i = 0; i < n; i += div) { var list = new List<(int id, int a, int b)>(); for (var j = 0; j < div && i + j < n; ++j) { var a = dic[map[i + j][0]]; var b = dic[map[i + j][1]]; p[a] = i + j; p[b] = i + j; list.Add((i + j, Math.Min(a, b), Math.Max(a, b))); } if (i / div % 2 == 0) list.Sort((l, r) => l.b.CompareTo(r.b)); else list.Sort((l, r) => r.b.CompareTo(l.b)); dlist.Add(list); } var dp = new bool[n]; var count = 0; var pa = 0; var pb = 0; var ans = 0L; var change = 0L; foreach (var dli in dlist) { foreach (var li in dli) { while (pb < li.b + 1) { dp[p[pb]] = !dp[p[pb]]; if (dp[p[pb]]) ++count; else --count; ++pb; ++change; } while (li.a < pa) { --pa; dp[p[pa]] = !dp[p[pa]]; if (dp[p[pa]]) ++count; else --count; ++change; } while (pa < li.a) { dp[p[pa]] = !dp[p[pa]]; if (dp[p[pa]]) ++count; else --count; ++pa; ++change; } while (li.b + 1 < pb) { --pb; dp[p[pb]] = !dp[p[pb]]; if (dp[p[pb]]) ++count; else --count; ++change; } ans += count; } } return ans / 2; } }