#include<bits/stdc++.h>
#define N 100000
#define int long long
using namespace std;
int n;
struct Tree{
int mei,jia,maxn1,maxn2,minn1,minn2;
}tree[4*N];
bool num[1000005];
void update1(int l,int r,int root,int p1,int p2,int p3){
if(l==r){
tree[root].mei=p2;
tree[root].jia=p3;
tree[root].maxn1=tree[root].minn1=p3;
tree[root].maxn2=tree[root].minn2=r;
return ;
}
int mid=(l+r)>>1;
if(p1<=mid)
update1(l,mid,root<<1,p1,p2,p3);
else
update1(mid+1,r,root<<1|1,p1,p2,p3);
tree[root].mei=tree[root<<1].mei+tree[root<<1|1].mei;
tree[root].jia=tree[root<<1].jia+tree[root<<1|1].jia;
if(tree[root<<1].maxn1>tree[root<<1|1].maxn1){
tree[root].maxn1=tree[root<<1].maxn1;
tree[root].maxn2=tree[root<<1].maxn2;
}
else{
tree[root].maxn1=tree[root<<1|1].maxn1;
tree[root].maxn2=tree[root<<1|1].maxn2;
}
if(tree[root<<1].minn1<tree[root<<1|1].minn1){
tree[root].minn1=tree[root<<1].minn1;
tree[root].minn2=tree[root<<1].minn2;
}
else{
tree[root].minn1=tree[root<<1|1].minn1;
tree[root].minn2=tree[root<<1|1].minn2;
}
}
void update2(int l,int r,int root){
if(l==r){
num[tree[root].jia]=0;
tree[root].jia=tree[root].mei=tree[root].maxn1=tree[root].maxn2=tree[root].minn2=0;
tree[root].minn1=0x3f3f3f3f;
return ;
}
int mid=(l+r)>>1;
if(tree[root].minn2<=mid)
update2(l,mid,root<<1);
else
update2(mid+1,r,root<<1|1);
tree[root].mei=tree[root<<1].mei+tree[root<<1|1].mei;
tree[root].jia=tree[root<<1].jia+tree[root<<1|1].jia;
if(tree[root<<1].maxn1>tree[root<<1|1].maxn1){
tree[root].maxn1=tree[root<<1].maxn1;
tree[root].maxn2=tree[root<<1].maxn2;
}
else{
tree[root].maxn1=tree[root<<1|1].maxn1;
tree[root].maxn2=tree[root<<1|1].maxn2;
}
if(tree[root<<1].minn1<tree[root<<1|1].minn1){
tree[root].minn1=tree[root<<1].minn1;
tree[root].minn2=tree[root<<1].minn2;
}
else{
tree[root].minn1=tree[root<<1|1].minn1;
tree[root].minn2=tree[root<<1|1].minn2;
}
}
void update3(int l,int r,int root){
if(l==r){
num[tree[root].jia]=0;
tree[root].jia=tree[root].mei=tree[root].maxn1=tree[root].maxn2=tree[root].minn2=0;
tree[root].minn1=0x3f3f3f3f;
return ;
}
int mid=(l+r)>>1;
if(tree[root].maxn2<=mid)
update3(l,mid,root<<1);
else
update3(mid+1,r,root<<1|1);
tree[root].mei=tree[root<<1].mei+tree[root<<1|1].mei;
tree[root].jia=tree[root<<1].jia+tree[root<<1|1].jia;
if(tree[root<<1].maxn1>tree[root<<1|1].maxn1){
tree[root].maxn1=tree[root<<1].maxn1;
tree[root].maxn2=tree[root<<1].maxn2;
}
else{
tree[root].maxn1=tree[root<<1|1].maxn1;
tree[root].maxn2=tree[root<<1|1].maxn2;
}
if(tree[root<<1].minn1<tree[root<<1|1].minn1){
tree[root].minn1=tree[root<<1].minn1;
tree[root].minn2=tree[root<<1].minn2;
}
else{
tree[root].minn1=tree[root<<1|1].minn1;
tree[root].minn2=tree[root<<1|1].minn2;
}
}
signed main(){
int p,w,c;
while(cin>>p&&p!=-1){
if(p==1){
cin>>w>>c;
if(!num[c])
update1(1,N,1,++n,w,c);
num[c]=1;
}
else{
if(p==2){
if(tree[1].mei&&tree[1].jia)
update3(1,N,1);
}
else{
if(tree[1].mei&&tree[1].jia)
update2(1,N,1);
}
}
}
cout<<tree[1].mei<<' '<<tree[1].jia;
return 0;
}