#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long int64;
const int N = 500500;
const int64 base = 500519;
const int64 base2 = 502181;
int n, m, res;
int64 pw[N];
int64 pw2[N];
pair < int, int > a[N];
int lab[N]; /// DSU
vector < list < int > > comp;
int par(int u){
return (lab[u] < 0 ? u : lab[u] = par(lab[u]));
}
#define mid ((l + r) >> 1)
int pos[N];
struct node_t{
int len;
pair < int64, int64 > hs;
node_t operator+(const node_t &other)const{
node_t ret;
ret.len = len + other.len;
ret.hs.first = hs.first * pw[other.len] + other.hs.first;
ret.hs.second = hs.second * pw2[other.len] + other.hs.second;
return ret;
}
bool operator ==(const node_t &other)const{
return (len == other.len && hs == other.hs);
}
};
node_t it[N << 2];
node_t rev[N << 2];
void build(int x, int l, int r){
if(l == r){
pos[r] = x;
it[x] = rev[x] = {1, {par(r), par(r)}};
return;
}
build(x + x, l, mid);
build(x + x + 1, mid + 1, r);
it[x] = it[x + x] + it[x + x + 1];
rev[x] = rev[x + x + 1] + rev[x + x];
}
void upd(int x, int c){
int cur = pos[x];
it[cur] = rev[cur] = {1, {c, c}};
cur /= 2;
while(cur){
it[cur] = it[cur + cur] + it[cur + cur + 1];
rev[cur] = rev[cur + cur + 1] + rev[cur + cur];
cur /= 2;
}
}
node_t query(int x, int l, int r, int u, int v){
if(l > v || r < u) return {0, {0, 0}};
if(l >= u && r <= v) return it[x];
node_t ans = query(x + x , l, mid, u, v) + query(x + x + 1, mid + 1, r, u, v);
return ans;
}
node_t queryRev(int x, int l, int r, int u, int v){
if(l > v || r < u) return {0, {0, 0}};
if(l >= u && r <= v) return rev[x];
return queryRev(x + x + 1, mid + 1, r, u, v) + query(x + x, l, mid, u, v);
}
#undef mid
void join(int u, int v, bool update = false){
u = par(u); v = par(v);
if(u == v) return;
if(lab[u] > lab[v]) swap(u, v);
lab[u] += lab[v];
lab[v] = u;
--res;
for(int x : comp[v]) {
if(update) upd(x, u);
comp[u].push_back(x);
}
return comp[v].clear();
}
bool cmp(pair < int, int > u, pair < int, int > v){
return (u.second - u.first) > (v.second - v.first);
}
int main(){
pw[0] = pw2[0] = 1;
scanf("%d", &n);
for(int i = 1; i <= n; ++i){
pw[i] = pw[i - 1] * base;
pw2[i] = pw2[i - 1] * base2;
}
scanf("%d", &m);
for(int i = 1; i <= m; ++i){
scanf("%d%d", &a[i].first, &a[i].second);
}
comp.resize(n + 1);
memset(lab, -1, sizeof lab);
for(int i = 1; i <= n; ++i){
comp[i].push_back(i);
}
sort(a + 1, a + m + 1, cmp);
res = n;
for(int i = m; i >= 1; --i){
if(a[i].second - a[i].first > 1000) break;
int mid = (a[i].second + a[i].first) / 2;
for(int x = a[i].first; x <= mid; ++x){
int v = a[i].second - x + a[i].first;
join(x, v);
}
m = i - 1;
}
int start = 1;
for(int i = 1; i <= min(m, 20); ++i){
int mid = (a[i].second + a[i].first) / 2;
for(int x = a[i].first; x <= mid; ++x){
int v = a[i].second - x + a[i].first;
join(x, v);
}
start = i + 1;
}
build(1, 1, n);
for(int i = start; i <= m; ++i){
int l = a[i].first;
int r = a[i].second;
int u = (l + r) >> 1;
int v = u + (l % 2 != r % 2);
while(l < r){
if(query(1, 1, n, l, u) == queryRev(1, 1, n, v, r)) break;
int low = 0, high = u - l, ans = -1;
while(low <= high){
int mid = (low + high) >> 1;
if(query(1, 1, n, l, l + mid) == query(1, 1, n, r - mid, r)){
low = mid + 1;
}
else{
high = mid - 1;
ans = mid;
}
}
join(l + ans, r - ans);
l += ans + 1;
r -= ans + 1;
}
}
cout << res;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50NjQ7Cgpjb25zdCBpbnQgTiA9IDUwMDUwMDsKY29uc3QgaW50NjQgYmFzZSA9IDUwMDUxOTsKY29uc3QgaW50NjQgYmFzZTIgPSA1MDIxODE7CiAKaW50IG4sIG0sIHJlczsKaW50NjQgcHdbTl07CmludDY0IHB3MltOXTsKcGFpciA8IGludCwgaW50ID4gYVtOXTsKCmludCBsYWJbTl07IC8vLyBEU1UKdmVjdG9yIDwgbGlzdCA8IGludCA+ID4gY29tcDsKCmludCBwYXIoaW50IHUpewoJcmV0dXJuIChsYWJbdV0gPCAwID8gdSA6IGxhYlt1XSA9IHBhcihsYWJbdV0pKTsKfQoKI2RlZmluZSBtaWQgKChsICsgcikgPj4gMSkKCmludCBwb3NbTl07CgpzdHJ1Y3Qgbm9kZV90ewoJaW50IGxlbjsKCXBhaXIgPCBpbnQ2NCwgaW50NjQgPiBoczsKCglub2RlX3Qgb3BlcmF0b3IrKGNvbnN0IG5vZGVfdCAmb3RoZXIpY29uc3R7CgkJbm9kZV90IHJldDsKCQlyZXQubGVuID0gbGVuICsgb3RoZXIubGVuOwoJCXJldC5ocy5maXJzdCA9IGhzLmZpcnN0ICogcHdbb3RoZXIubGVuXSArIG90aGVyLmhzLmZpcnN0OwoJCXJldC5ocy5zZWNvbmQgPSBocy5zZWNvbmQgKiBwdzJbb3RoZXIubGVuXSArIG90aGVyLmhzLnNlY29uZDsKCQlyZXR1cm4gcmV0OwoJfQoKCWJvb2wgb3BlcmF0b3IgPT0oY29uc3Qgbm9kZV90ICZvdGhlciljb25zdHsKCQlyZXR1cm4gKGxlbiA9PSBvdGhlci5sZW4gJiYgaHMgPT0gb3RoZXIuaHMpOwoJfQp9OwoKbm9kZV90IGl0W04gPDwgMl07Cm5vZGVfdCByZXZbTiA8PCAyXTsKCnZvaWQgYnVpbGQoaW50IHgsIGludCBsLCBpbnQgcil7CglpZihsID09IHIpewoJCXBvc1tyXSA9IHg7CgkJaXRbeF0gPSByZXZbeF0gPSB7MSwge3BhcihyKSwgcGFyKHIpfX07CgkJcmV0dXJuOwoJfQoJYnVpbGQoeCArIHgsIGwsIG1pZCk7CglidWlsZCh4ICsgeCArIDEsIG1pZCArIDEsIHIpOwoJaXRbeF0gPSBpdFt4ICsgeF0gKyBpdFt4ICsgeCArIDFdOwoJcmV2W3hdID0gcmV2W3ggKyB4ICsgMV0gKyByZXZbeCArIHhdOwp9Cgp2b2lkIHVwZChpbnQgeCwgaW50IGMpewoJaW50IGN1ciA9IHBvc1t4XTsKCWl0W2N1cl0gPSByZXZbY3VyXSA9IHsxLCB7YywgY319OwoJY3VyIC89IDI7CgoJd2hpbGUoY3VyKXsKCQlpdFtjdXJdID0gaXRbY3VyICsgY3VyXSArIGl0W2N1ciArIGN1ciArIDFdOwoJCXJldltjdXJdID0gcmV2W2N1ciArIGN1ciArIDFdICsgcmV2W2N1ciArIGN1cl07CgkJY3VyIC89IDI7Cgl9Cn0KCm5vZGVfdCBxdWVyeShpbnQgeCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYpewoJaWYobCA+IHYgfHwgciA8IHUpIHJldHVybiB7MCwgezAsIDB9fTsKCWlmKGwgPj0gdSAmJiByIDw9IHYpIHJldHVybiBpdFt4XTsKCW5vZGVfdCBhbnMgPSAgcXVlcnkoeCArIHggLCBsLCBtaWQsIHUsIHYpICsgcXVlcnkoeCArIHggKyAxLCBtaWQgKyAxLCByLCB1LCB2KTsKCXJldHVybiBhbnM7Cn0KCm5vZGVfdCBxdWVyeVJldihpbnQgeCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYpewoJaWYobCA+IHYgfHwgciA8IHUpIHJldHVybiB7MCwgezAsIDB9fTsKCWlmKGwgPj0gdSAmJiByIDw9IHYpIHJldHVybiByZXZbeF07CglyZXR1cm4gcXVlcnlSZXYoeCArIHggKyAxLCBtaWQgKyAxLCByLCB1LCB2KSArIHF1ZXJ5KHggKyB4LCBsLCBtaWQsIHUsIHYpOwp9CgojdW5kZWYgbWlkCgp2b2lkIGpvaW4oaW50IHUsIGludCB2LCBib29sIHVwZGF0ZSA9IGZhbHNlKXsKCXUgPSBwYXIodSk7IHYgPSBwYXIodik7CglpZih1ID09IHYpIHJldHVybjsKCWlmKGxhYlt1XSA+IGxhYlt2XSkgc3dhcCh1LCB2KTsKCWxhYlt1XSArPSBsYWJbdl07CglsYWJbdl0gPSB1OwoJLS1yZXM7Cglmb3IoaW50IHggOiBjb21wW3ZdKSB7CgkJaWYodXBkYXRlKSB1cGQoeCwgdSk7CgkJY29tcFt1XS5wdXNoX2JhY2soeCk7Cgl9CglyZXR1cm4gY29tcFt2XS5jbGVhcigpOwp9Cgpib29sIGNtcChwYWlyIDwgaW50LCBpbnQgPiB1LCBwYWlyIDwgaW50LCBpbnQgPiB2KXsKCXJldHVybiAodS5zZWNvbmQgLSB1LmZpcnN0KSA+ICh2LnNlY29uZCAtIHYuZmlyc3QpOwp9CgppbnQgbWFpbigpewoKCXB3WzBdID0gcHcyWzBdID0gMTsKCglzY2FuZigiJWQiLCAmbik7Cglmb3IoaW50IGkgPSAxOyBpIDw9IG47ICsraSl7CgkJcHdbaV0gPSBwd1tpIC0gMV0gKiBiYXNlOwoJCXB3MltpXSA9IHB3MltpIC0gMV0gKiBiYXNlMjsKCX0KCglzY2FuZigiJWQiLCAmbSk7Cglmb3IoaW50IGkgPSAxOyBpIDw9IG07ICsraSl7CgkJc2NhbmYoIiVkJWQiLCAmYVtpXS5maXJzdCwgJmFbaV0uc2Vjb25kKTsKCX0KCgljb21wLnJlc2l6ZShuICsgMSk7CgoJbWVtc2V0KGxhYiwgLTEsIHNpemVvZiBsYWIpOwoJZm9yKGludCBpID0gMTsgaSA8PSBuOyArK2kpewoJCWNvbXBbaV0ucHVzaF9iYWNrKGkpOwoJfQoKCXNvcnQoYSArIDEsIGEgKyBtICsgMSwgY21wKTsKCglyZXMgPSBuOwoKCWZvcihpbnQgaSA9IG07IGkgPj0gMTsgLS1pKXsKCgkJaWYoYVtpXS5zZWNvbmQgLSBhW2ldLmZpcnN0ID4gMTAwMCkgYnJlYWs7CgkJaW50IG1pZCA9IChhW2ldLnNlY29uZCArIGFbaV0uZmlyc3QpIC8gMjsKCQlmb3IoaW50IHggPSBhW2ldLmZpcnN0OyB4IDw9IG1pZDsgKyt4KXsKCQkJaW50IHYgPSBhW2ldLnNlY29uZCAtIHggKyBhW2ldLmZpcnN0OwoJCQlqb2luKHgsIHYpOwoJCX0KCQltID0gaSAtIDE7CQkKCX0KCglpbnQgc3RhcnQgPSAxOwoKCWZvcihpbnQgaSA9IDE7IGkgPD0gbWluKG0sIDIwKTsgKytpKXsKCgkJaW50IG1pZCA9IChhW2ldLnNlY29uZCArIGFbaV0uZmlyc3QpIC8gMjsKCQlmb3IoaW50IHggPSBhW2ldLmZpcnN0OyB4IDw9IG1pZDsgKyt4KXsKCQkJaW50IHYgPSBhW2ldLnNlY29uZCAtIHggKyBhW2ldLmZpcnN0OwoJCQlqb2luKHgsIHYpOwoJCX0KCQlzdGFydCA9IGkgKyAxOwoJfQoKCWJ1aWxkKDEsIDEsIG4pOwoKCWZvcihpbnQgaSA9IHN0YXJ0OyBpIDw9IG07ICsraSl7CgkJaW50IGwgPSBhW2ldLmZpcnN0OwoJCWludCByID0gYVtpXS5zZWNvbmQ7CgkJaW50IHUgPSAobCArIHIpID4+IDE7CgkJaW50IHYgPSB1ICsgKGwgJSAyICE9IHIgJSAyKTsKCgkJd2hpbGUobCA8IHIpewoJCQlpZihxdWVyeSgxLCAxLCBuLCBsLCB1KSA9PSBxdWVyeVJldigxLCAxLCBuLCB2LCByKSkgYnJlYWs7CgkJCWludCBsb3cgPSAwLCBoaWdoID0gdSAtIGwsIGFucyA9IC0xOwoJCgkJCXdoaWxlKGxvdyA8PSBoaWdoKXsKCQkJCWludCBtaWQgPSAobG93ICsgaGlnaCkgPj4gMTsKCQkJCWlmKHF1ZXJ5KDEsIDEsIG4sIGwsIGwgKyBtaWQpID09IHF1ZXJ5KDEsIDEsIG4sIHIgLSBtaWQsIHIpKXsKCQkJCQlsb3cgPSBtaWQgKyAxOwoJCQkJfQoJCQkJZWxzZXsKCQkJCQloaWdoID0gbWlkIC0gMTsKCQkJCQlhbnMgPSBtaWQ7CgkJCQl9CgkJCX0KCQkJam9pbihsICsgYW5zLCByIC0gYW5zKTsKCQkJbCArPSBhbnMgKyAxOwoJCQlyIC09IGFucyArIDE7CgkJfQoJfQoKCWNvdXQgPDwgcmVzOwoKCXJldHVybiAwOwp9