class BookMyShow {
public:
struct node{
int l,r;
long long mx,sum,lazy;
}tr[1000010];
int n,m;
void build(int u,int l,int r) {
tr[u]={l,r,0,0,-1};
if(l==r) return;
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
}
void pushup(int u) {
tr[u].mx=max(tr[u<<1].mx,tr[u<<1|1].mx);
tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
}
void pushdown(int x) {
node &u=tr[x],&l=tr[x<<1],&r=tr[x<<1|1];
if(u.lazy!=-1) {
l.lazy=r.lazy=u.lazy;
l.mx=r.mx=l.sum=r.sum=0;
u.lazy=-1;
}
}
void modify1(int u,int x,int v) {
if(tr[u].l==x&&tr[u].r==x) {
tr[u].mx=tr[u].sum=v;
return;
}
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if(x<=mid) modify1(u<<1,x,v);
else modify1(u<<1|1,x,v);
pushup(u);
}
void modify2(int u,int l,int r) {
if(tr[u].l>=l&&tr[u].r<=r) {
tr[u].mx=tr[u].sum=tr[u].lazy=0;
return;
}
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid) modify2(u<<1,l,r);
if(r>mid) modify2(u<<1|1,l,r);
pushup(u);
}
int query1(int u,int v) {
pushdown(u);
if(tr[u].l==tr[u].r&&tr[u].mx>=v) return tr[u].l;
if(tr[u<<1].mx>=v) return query1(u<<1,v);
else if(tr[u<<1|1].mx>=v) return query1(u<<1|1,v);
else return -1;
}
pair<int,int>query2(int u,int x) {
if(tr[u].l==x&&tr[u].r==x) return {tr[u].mx,tr[u].sum};
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if(x<=mid) return query2(u<<1,x);
else return query2(u<<1|1,x);
}
int query3(int u,int x) {
pushdown(u);
int res=1e8;
if(tr[u].sum>=x) res=tr[u].r;
if(tr[u<<1].sum>=x) res=min(res,query3(u<<1,x));
else if(tr[u].sum>=x) res=min(res,query3(u<<1|1,x-tr[u<<1].sum));
return res;
}
long long query4(int u,int l,int r) {
if(tr[u].l>=l&&tr[u].r<=r) {
return tr[u].sum;
}
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
long long res=0;
if(l<=mid) res+=query4(u<<1,l,r);
if(r>mid) res+=query4(u<<1|1,l,r);
return res;
}
BookMyShow(int n, int m) {
this->n=n,this->m=m;
build(1,1,n);
for(int i=1;i<=n;i++) modify1(1,i,m);
}
vector<int> gather(int k, int maxRow) {
int a=query1(1,k);
if(a==-1||a-1>maxRow) return {};
pair<int,int>p=query2(1,a);
int b=p.first,c=p.second;
modify1(1,a,b-k);
return {a-1,m-b};
}
bool scatter(int k, int maxRow) {
int a=query3(1,k);
if(a==1e8||a-1>maxRow) return false;
long long pre=0,rt=0;
if(a!=1) pre=query4(1,1,a-1),rt=k-pre;
else pre=0,rt=k;
long long rest=query2(1,a).first;
modify1(1,a,rest-rt);
//cout<<rest-rt;
if(a>1) modify2(1,1,a-1);
return true;
}
};