为什么这么写不对呀
#include <bits/stdc++.h>
#define il inline
using namespace std;
typedef long long ll;
const int N=5e5+5;
int n,m,b[N],cur,ans[N];ll h,a[N],s[N];
int tot,root;
struct node{
int w,siz,cnt,ls,rs;ll v;
il node(){v=0ll,w=siz=cnt=ls=rs=0;}
}tree[N];
il void pushup(int x){tree[x].siz=tree[tree[x].ls].siz+tree[tree[x].rs].siz+tree[x].cnt;}
il void lrot(int &x){
int y=tree[x].rs;
tree[x].rs=tree[y].ls,tree[y].ls=x,tree[y].siz=tree[x].siz;
pushup(x),x=y;
}
il void rrot(int &x){
int y=tree[x].ls;
tree[x].ls=tree[y].rs,tree[y].rs=x,tree[y].siz=tree[x].siz;
pushup(x),x=y;
}
void insert(int &x,ll val){
if(!x){
x=(++tot),tree[x].v=1ll*val,tree[x].w=rand(),tree[x].siz=tree[x].cnt=1;
return ;
}
++tree[x].siz;
if(tree[x].v==val){++tree[x].cnt;return ;}
else if(val<tree[x].v){
insert(tree[x].ls,val);
if(tree[tree[x].ls].w<tree[x].w) rrot(x);
}
else{
insert(tree[x].rs,val);
if(tree[tree[x].rs].w<tree[x].w) lrot(x);
}
}
int del(int &x,ll val){
if(!x) return 0;
if(tree[x].v==val){
if(tree[x].cnt>1){--tree[x].siz,--tree[x].cnt;return 1;}
if(!tree[x].ls || !tree[x].rs) {x=tree[x].ls+tree[x].rs;return 1;}
else if(tree[tree[x].ls].w<tree[tree[x].rs].w){rrot(x);return del(x,val);}
else {lrot(x);return del(x,val);}
}
else if(val<tree[x].v){
int y=del(tree[x].ls,val);
if(y) --tree[x].siz;
return y;
}
else{
int y=del(tree[x].rs,val);
if(y) --tree[x].siz;
return y;
}
}
ll querynum(int x,int val){
if(!x || !val) return 0ll;
if(val<=tree[tree[x].ls].siz) return querynum(tree[x].ls,val);
else if(val>tree[tree[x].ls].siz+tree[x].cnt) return querynum(tree[x].rs,val-tree[tree[x].ls].siz-tree[x].cnt);
else return tree[x].v;
}
int x,y,z;ll u,v,w,sum,sumd;
int main(){
scanf("%d%d%lld",&n,&m,&h);
for(int i=1;i<=n;++i) scanf("%lld%d",&a[i],&b[i]);
for(int i=1;i<=m;++i) insert(root,0ll);
u=0ll;
for(int i=1;i<=n;++i){
u+=1ll*a[i];
if(u>=h){ans[0]=i-1;break;}
}
cur=1;
for(int i=1;i<=n;++i){
u=querynum(root,m-cur+1);
if(s[b[i]]>=u) sumd-=s[b[i]];
del(root,s[b[i]]),insert(root,s[b[i]]+1ll*a[i]);
u=querynum(root,m-cur+1);
if(s[b[i]]+1ll*a[i]>=u) sumd+=s[b[i]]+1ll*a[i];
sum+=1ll*a[i];
while(cur<=m && sum-sumd>=h) ans[cur]=i-1,++cur,sumd+=querynum(root,m-cur+1);
s[b[i]]+=a[i];
//printf("%d %d %lld\n",i,cur,sumd);
}
for(int i=cur;i<=m;++i) ans[i]=n;
for(int i=0;i<=m;++i) printf("%d ",ans[i]);
return 0;
}