/*
线段树维护数轴上的黑点数,一次染色相当于一次区间修改
区间修改就意味着lazy的标记和下放,下方是很费时间的
想对于每个点lazy标记最多下放一次,所以下放过的lazy不清零,而是变为2,以后只下放lazy==1的即可
*/
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=200010;
int n,m,opx,opy;
struct node{
int l,r,v,lazy;
}tr[maxn<<4];
void build(int l,int r,int k){
tr[k].l=l;tr[k].r=r;tr[k].v=1;
if(l==r)return;
int mid=(l+r)>>1;
build(l,mid,k<<1);
build(mid+1,r,k<<1|1);
tr[k].v=tr[k<<1].v+tr[k<<1|1].v;
}
void update(int k){
tr[k].lazy=2;
tr[k].v=0;
if(tr[k].l==tr[k].r)return;
update(k<<1);
update(k<<1|1);
}
void change(int l,int r,int k){
if(tr[k].l==l&&tr[k].r==r){
tr[k].v=0;
if(tr[k].lazy==0)tr[k].lazy=1;
return;
}
if(tr[k].lazy==1)update(k);
int mid=(tr[k].l+tr[k].r)>>1;
if(r<=mid)change(l,r,k<<1);
else if(l>mid)change(l,r,k<<1|1);
else {
change(l,mid,k<<1);
change(mid+1,r,k<<1|1);
}
tr[k].v=tr[k<<1].v+tr[k<<1|1].v;
}
int main(){
scanf("%d%d",&n,&m);
build(1,n,1);
for(int i=1;i<=m;i++){
scanf("%d%d",&opx,&opy);
change(opx,opy,1);
printf("%d\n",tr[1].v);
}
}