单点修改,维护元素个数。 O ( n log 2 n ) O(n\log^2 n) O(nlog2n)
如果只是插入元素,那么二分修改即可一个log。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
double Max[400010];
int sum[400010];
inline int read()
{
char c=getchar();int x=0,flag=1;
while(!isdigit(c)){if(c=='-') flag=-1;c=getchar();}
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x*flag;
}
int query(int root,int l,int r,double k)
{
if(l==r) return Max[root]>k;
if(Max[root]<=k) return 0;
int mid=l+r>>1;
if(Max[root<<1]<=k) return query(root<<1|1,mid+1,r,k);
else return query(root<<1,l,mid,k)+sum[root]-sum[root<<1];
}
void update(int root,int l,int r,int x,double k)
{
if(l==r)
{
sum[root]=1;
Max[root]=k;
return;
}
int mid=l+r>>1;
if(x<=mid) update(root<<1,l,mid,x,k);
else update(root<<1|1,mid+1,r,x,k);
Max[root]=max(Max[root<<1],Max[root<<1|1]);
sum[root]=sum[root<<1]+query(root<<1|1,mid+1,r,Max[root<<1]);
}
int main()
{
int n=read(),m=read();
for(int i=1;i<=m;i++)
{
int x=read(),y=read();
update(1,1,n,x,1.0*y/x);
cout<<sum[1]<<'\n';
}
return 0;
}