#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
#define int long long
#define N 300010
using namespace std;
int q,t;
int seg[N<<2];
int kkk[N];
struct Node{
int id,ren;
};
void update(int u,int l,int r,int k,int d) {
if (l==r) {
seg[u]=d;
return;
}
int mid=l+r>>1;
if (mid>=k) update(u<<1,l,mid,k,d);
else update(u<<1|1,mid+1,r,k,d);
seg[u]=min(seg[u<<1],seg[u<<1|1]);
}
int query(int u,int l,int r,int ll,int rr) {
if (ll<=l&&r<=rr) {
return seg[u];
}
int mid=l+r>>1,ans=1e12;
if (mid>=ll) ans=min(ans,query(u<<1,l,mid,ll,rr));
if (mid<rr) ans=min(ans,query(u<<1|1,mid+1,r,ll,rr));
return ans;
}
signed main(void) {
ios::sync_with_stdio(false);
cin >> q;
for (int opt,a,b;q--;) {
cin >> opt >> a;
if (opt==1) {
cin >> b;
t++;
kkk[t]=a;
if (b) update(1,1,200000,t,0);
else update(1,1,200000,t,a);
} else if (opt==2) {
update(1,1,200000,a,1e12);
kkk[a]=0;
} else {
vector<Node> ve;
for (;;) {
int ll=1,rr=t;
for (;ll<=rr;) {
int mid=ll+rr>>1;
if (query(1,1,200000,1,mid)<=a) rr=mid-1;
else ll=mid+1;
}
int vvv1=ll;
if (ll>t) break;
if (kkk[ll]>a) {
ve.push_back(Node{vvv1,a});
kkk[vvv1]-=a;
a=0;
break;
} else {
a-=kkk[vvv1];
ve.push_back(Node{vvv1,kkk[vvv1]});
kkk[vvv1]=0;
update(1,1,200000,vvv1,1e12);
}
}
cout << ve.size() << endl;
for (auto it:ve) cout << it.id << " " << it.ren << endl;
}
}
return 0;
}
不知道 WA 在那里。