#include<bits/stdc++.h>
#define int long long
using namespace std;
const int INF=0x3f3f3f3f;
struct tree{
int s[2],fa;
int val,wei;
void init(int V,int W,int F){
val=V;wei=W;
fa=F;
}
}t[1000001];
int ans1,ans2;
int root,idx;
void rotate(int u)
{
int x=t[u].fa,y=t[x].fa;
int k=(t[x].s[1]==u);
t[y].s[t[y].s[1]==x]=u;t[u].fa=y;
t[x].s[k]=t[u].s[k^1];t[t[u].s[k^1]].fa=x;
t[u].s[k^1]=x;t[x].fa=u;
}
void splay(int u,int k)
{
while(t[u].fa!=k)
{
int x=t[u].fa,y=t[x].fa;
if(y!=k)
{
if((t[x].s[1]==u)^(t[y].s[1]==x))
rotate(u);
else rotate(x);
}
rotate(u);
}
if(!k) root=u;
}
void insert(int val,int wei)
{
int u=root,fa=0;
while(u&&t[u].val!=val) fa=u,u=t[u].s[val>t[u].val];
if(!u)
{
u=++idx;
ans1+=wei,ans2+=val;
if(fa) t[fa].s[val>t[fa].val]=u;
t[u].init(val,wei,fa);
}
splay(u,0);
}
void find(int val)
{
int u=root;
if(!u) return ;
while(t[u].s[val>t[u].val]&&val!=t[u].val)
u=t[u].s[val>t[u].val];
splay(u,0);
}
int pre(int val)
{
find(val);
int u=t[root].s[0];
while(t[u].s[1]) u=t[u].s[1];
return u;
}
int next(int val)
{
find(val);
int u=t[root].s[1];
while(t[u].s[0]) u=t[u].s[0];
return u;
}
void remove(int val)
{
int l=pre(val),r=next(val);
splay(l,0);splay(r,l);
t[r].s[0]=0;
}
signed main()
{
insert(-INF,0);insert(INF,0);
while(1)
{
int op,x,y;
scanf("%lld",&op);
if(op==-1)
{
printf("%lld %lld",ans1,ans2);
return 0;
}
else if(op==1)
{
scanf("%lld %lld",&x,&y);
insert(y,x);
}
else if(op==3)
{
int u=pre(INF);
if(u!=-INF)
{
ans1-=t[u].wei;ans2-=t[u].val;
remove(t[u].val);
}
}
else
{
int u=next(-INF);
if(u!=INF)
{
ans1-=t[u].wei;ans2-=t[u].val;
remove(t[u].val);
}
}
}
return 0;
}