// yukicoder: No.674 n連勤 // 2019.7.21 bal4u #include #include typedef long long ll; #if 1 #define gc() getchar_unlocked() #define pc(c) putchar_unlocked(c) #else #define gc() getchar() #define pc(c) putchar(c) #endif int in() { // 非負整数の入力 int n = 0; int c = gc(); do n = 10 * n + (c & 0xf); while ((c = gc()) >= '0'); return n; } ll In() { // 非負整数の入力(long long対応) ll n = 0; int c = gc(); do n = 10 * n + (c & 0xf); while ((c = gc()) >= '0'); return n; } void out(ll n) { // 正整数の表示(出力) int i; char b[50]; i = 0; while (n) b[i++] = n % 10 + '0', n /= 10; while (i--) pc(b[i]); pc('\n'); } const ll INF = 1000000000000000000LL+10; typedef struct { ll a, b; } T; T t[30003]; int sz; ll D, ans; // 二分探索。見つからなければ、一つ小さい要素を返す int bsch(int l, ll x) { int r = sz; while (l < r) { int m = (l+r) >> 1; if (t[m].a <= x) l = m + 1; else r = m; } return l-1; } void ma(int id) { ll w = t[id].b-t[id].a+1; if (w > ans) ans = w; } void del(int l, int r) { int i; if (l > r) return; for (i = r+1; i < sz; i++) memcpy(t+l++, t+i, sizeof(T)); sz = l; } void add(int l) { int i; for (i = sz; i > l; i--) memcpy(t+i, t+i-1, sizeof(T)); sz++; } void resolv(ll a, ll b) { int l = bsch(0, a), r = bsch(l, b); if (t[l].b+1 < a) { if (b+1 < t[l+1].a) { add(l++), t[l].a = a, t[l].b = b, ma(l); return; } t[++l].a = a; } if (b+1 == t[r+1].a) r++; if (b <= t[r].b) t[l].b = t[r].b; else if (b+1 < t[r+1].a) t[l].b = b; ma(l), del(l+1, r); } int main() { D = In(); int Q = in(); t[0].a = t[0].b = -2, t[1].a = t[1].b = INF, sz = 2; while (Q--) { ll a = In(), b = In(); resolv(a, b); out(ans); // int i; for (i = 0; i+1 < sz; i++) printf("(%lld,%lld) ", t[i].a, t[i].b); printf("\n"); } return 0; }