#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;
}