import java.util.Scanner;
import java.util.*;
/**
* 参考deepseek:https://chat.deepseek.com/share/m17g1h95v6nn9w8hhk
*/
public class Main {
// 方法1:使用区间合并思想
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 while 处理多个 case
// 注意 hasNext 和 hasNextLine 的区别
int L = in.nextInt();// 总数为L+1
int M = in.nextInt();// 地铁施工区域数
// 1. 按区间起点排序
int[][] intervals = new int[M][2];
while (in.hasNextInt()) {
for (int i = 0; i < M; i++) {
for (int j = 0; j < 2; j++) {
// j:0,1,表示左右两个端点
intervals[i][j] = in.nextInt();
}
}
}
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
// 2. 合并重叠区间
List<int[]> merged = new ArrayList<>();
int[] current = intervals[0].clone();// 第0行的两个端点
// [0,1,2,3,4,5,6,7,8,9,10,......,L]
// [0,1] |
// [0 5] |--->合并为[0,5]
// [ 1 3] |
// [6, 9]
// merged结果:[[0,5],[6,9]]
for (int i = 1; i < intervals.length;
i++) { // 从第1行的两个端点开始遍历
if (intervals[i][0] <= current[1]) { // 有重叠,合并区间
current[1] = Math.max(current[1],
intervals[i][1]); //比较两行数据右端点哪个更大,取较大者
} else {
merged.add(current);// 无重叠,保存当前区间,开始新区间
current = intervals[i].clone();
}
}
merged.add(current);
// 3.计算总覆盖长度
int totalCovered = 0;
for (int[] interval : merged) {
int len = interval[1] - interval[0] + 1;
totalCovered += len;
}
// 4.计算剩余长度
int totalLength = L + 1;
int remaining = totalLength - totalCovered;
System.out.println(remaining);
}
}