#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h> //用mallco一定要加头函数
//有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,
// 即在0,1,2,...,L共L+1个位置上有L+1棵树。 现在要移走一些树,移走的树的区间用一对数字表示,
// 如 100 200表示移走从100到200之间(包括端点)所有的树。
//可能有M(1<=M<=100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的个数。
int main() {
int L; //长度为L,则共有L+1颗树
int M;
int left;
int right;
int num = 0;
scanf("%d%d", &L, &M);
// 核心:用calloc分配L+1个int大小的内存,且自动初始化为0
// int* tree = (int*)calloc(L + 1, sizeof(int));
// 核心:用mcalloc分配L+1个int大小的内存(不初始化)
int* tree = (int*)malloc((L + 1) * sizeof(
int)); // 动态分配L+1的内存空间
if (tree == NULL) {
printf("内存分配失败!L=%d 过大。\n", L);
return 1;
}
// 需手动初始化
memset(tree, 0, (L + 1) * sizeof(int));
for (int i = 0; i < M; ++i) {
scanf("%d%d", &left, &right);
for (int j = left; j <= right; ++j) {
tree[j] = 1; // 1表示树被挖走
}
}
for (int k = 0; k < L + 1; ++k) {
if (tree[k] == 0) {
num += 1;
}
}
printf("%d", num);
// 关键:用完后释放内存,避免内存泄漏
free(tree);
tree = NULL; // 置空,防止野指针
return 0;
}