rt,开O2 50pts 不开30pts
感觉写得没有问题。。
#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
using namespace std;
#define MAXN 100005
int n,m;
int b,c;
vector<int>B[330];
int l[330],r[330];
int id[MAXN];
double a[MAXN];
void upd(int x){
auto&q=B[x];
q.clear();
for(int i=l[x];i<=r[x];++i){
if(a[i]==0)continue;
if(q.empty()||q.back()<a[i])q.emplace_back(a[i]);
}
}
signed main(){
cin>>n>>m;
b=ceil(sqrt(n));
c=1+(n-1)/b;
for(int i=1;i<=c;++i){
l[i]=r[i-1]+1;
r[i]=min(r[i-1]+b,n);
for(int j=l[i];j<=r[i];++j){
id[j]=i;
}
}
int x,y,i,ans,mnid=n+1;
double mn;
while(m--){
cin>>x>>y;
a[x]=(double)y/x;
mnid=min(mnid,x);
upd(id[x]);
mn=a[mnid];
ans=1;
for(i=1;i<=c;++i){
if(B[i].empty()||mn>B[i].back())continue;
auto it=upper_bound(B[i].begin(),B[i].end(),mn);
ans+=B[i].end()-it;
mn=B[i].back();
}
cout<<ans<<'\n';
}
}