rt Code:
#include<bits/stdc++.h>
#define db double
#define ll long long
#define lc(x) (x<<1)
#define rc(x) ((x<<1)|1)
#define mid ((l+r)>>1)
#define maxn 100050
using namespace std;
ll n,m,len[maxn<<2];
bool flag[maxn<<2],flag2[maxn<<2];
db a[maxn<<2],mx[maxn<<2],x,y;
db max(db A,db B){return A>B?A:B;}
void pushup1(ll u){mx[u]=max(mx[lc(u)],mx[rc(u)]);}
ll pushup2(ll u,db cmp){
if (!flag2[u]) return 0;
if (flag[u]) return len[u]=(a[u]>cmp?1:0);
if(!cmp){pushup2(rc(u),mx[lc(u)]);}//特判 对于最左边没有pre的区间 要把右子树和左子树比较一下 更新好右子树先
if (mx[lc(u)]<=cmp){
// printf("Case 1:node=%lld mx=%lf cmp=%lf pushup2=%lld\n",u,mx[u],cmp,pushup2(rc(u),max(cmp,mx[lc(u)])));
return len[u]=pushup2(rc(u),cmp);
}
if (mx[lc(u)]>cmp){
// printf("Case 2:node=%lld mx=%lf cmp=%lf len[rc]=%lld pushup2=%lld\n",u,mx[u],cmp,len[rc(u)],pushup2(lc(u),cmp));
return len[u]=len[rc(u)]+pushup2(lc(u),cmp);
}
}
void upd(ll u,ll l,ll r,db pos,db add,db cmp){
if (r<pos||l>pos) return ;
flag2[u]=1;
if (l==r){
a[u]=(db)add/pos;
len[u]=a[u]>cmp?1:0;
mx[u]=a[u];
flag[u]=1;
return ;
}
if (l<=pos&&pos<=mid) upd(lc(u),l,mid,pos,add,cmp);
if (r>=pos&&pos>mid) upd(rc(u),mid+1,r,pos,add,max(cmp,mx[lc(u)]));
pushup1(u);pushup2(u,cmp);
}
int main(){
scanf("%lld%lld",&n,&m);
while (m--){
scanf("%llf%llf",&x,&y);
upd(1,1,n,x,y,0);
printf("%lld\n",len[1]);
}
return 0;
}