虽然样例没过
但是bzoj过了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define int long long
//#define debug cout<<1;
const int N = 1e5 + 1002,M = 110,inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
template <class T> void read(T &w){
w=0;int f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){(w*=10)+=ch-'0';ch=getchar();}
w*=f;
}
template <class T> void write(T w){
if(w<0){putchar('-');w*=-1;}
if(w/10) write(w/10);
putchar(w%10+'0');
}
int n,m;
struct node
{
int l,r;
int sum;
double maxx;
}tr[N * 4];
void build(int u,int l,int r)
{
tr[u].l = l, tr[u].r = r;
if(l == r)
{
tr[u].sum = 1;
tr[u].maxx = 0;
return;
}
int mid = l + r >> 1;
build(u << 1,l, mid), build(u << 1 | 1, mid + 1, r);
}
int query(int u,double MAXN)
{
if(tr[u].maxx <= MAXN)
{
return 0;
}
if(tr[u].l == tr[u].r)
{
if(tr[u].maxx > MAXN) return 1;
else return 0;
}
if(tr[u << 1].maxx <= MAXN)
{
return query(u << 1 | 1, MAXN);
}
if(tr[u << 1].maxx > MAXN)
{
return query(u << 1, MAXN) + tr[u].sum - tr[u << 1].sum;
}
}
void pushup(int u)
{
tr[u].maxx = max(tr[u << 1].maxx, tr[u << 1 | 1].maxx);
int mid = tr[u].l + tr[u].r >> 1;
tr[u].sum = tr[u << 1].sum + query(u << 1 | 1, tr[u << 1].maxx);
}
void modify(int u,int pos,double k)
{
if(tr[u].l == tr[u].r && tr[u].l == pos)
{
tr[u].maxx = k;
return;
}
int mid = tr[u].l + tr[u].r >> 1;
if(pos <= mid) modify(u << 1, pos,k);
if( pos > mid) modify(u << 1 | 1, pos, k);
pushup(u);
}
signed main()
{
read(n), read(m);
build(1,1,n);
for(int i = 1; i <= m; i ++)
{
int a,b;
read(a), read(b);
//debug
modify(1, a, (double)( (double)b/ (double)a) );
//debug
write(tr[1].sum);
//cout << "!";
puts("");
}
return 0;
}