合并状态分情况
#include <iostream>
#include <cstdio>
using namespace std;
int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return f*x;
}
const int N=1e5+5;
int n,m,x,y,tre[N*4];
double top[N*4],z;
int getans(int k,int l,int r,double p)
{
if(l==r)
{
if(top[k]>p) return 1;
return 0;
}
int mid=(l+r)/2;
if(top[k*2]<=p)
return getans(k*2+1,mid+1,r,p);
return getans(k*2,l,mid,p)+tre[k*2+1];
}
void change(int k,int l,int r,int x,double v)
{
if(r<x||l>x) return;
if(l==r)
{
tre[k]=1;
top[k]=v;
return;
}
int mid=(l+r)/2;
change(k*2,l,mid,x,v);
change(k*2+1,mid+1,r,x,v);
top[k]=max(top[k*2],top[k*2+1]);
tre[k*2+1]=getans(k*2+1,mid+1,r,top[k*2]);
tre[k]=tre[k*2]+tre[k*2+1];
}
int main()
{
n=read(); m=read();
for(int i=1;i<=m;i++)
{
x=read(); y=read(); z=1.0*y/x;
change(1,1,n,x,z);
cout<<tre[1]<<"\n";
}
return 0;
}