#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <cmath>
#include <map>
#include <utility>
using namespace std;
typedef long long ll;
const ll MOD = 1e9+7;


class segtree
{
	public:
	int depth;//セグ木の深さ(最上部が0）
	int size;
	vector<int> node;//セグ木本体

	//コンストラクタ
	segtree(int n)
	{
		depth=0;
		size=1;
		while(n>size)
		{
			size*=2;
			depth++;
		}
		size*=2;
		node.resize(size,0);
		//最下段に値を入れたあとに、下の段から順番に値を入れる
		//値を入れるには自分の子の2値を参照する
		/*
		for(int i=0;i<n;i++)
			node[i+(1<<depth)]=v[i];
		
		for(int i=depth-1;i>=0;i--)
			node[i]=calc(node[i*2],node[i*2+1]);*/
	}

	//値の更新
	//node[k]にaを加える
	void update(int k,int a)
	{
		k+=(1<<depth);//セグ木上のインデックスに読み替え
		node[k]+=a;
		while(k>1)
		{
			k/=2;
			node[k]=node[k*2]+node[k*2+1];
		}
		return;
	}
	
	//値の取得
	//閉区間[a,b]に値はいくつあるか
	int get(int a,int b)
	{
		a+=(1<<depth);
		b+=(1<<depth);
		if(a==b)
			return node[a];
		int nowa=node[a];
		int nowb=node[b];
		while(a/2<b/2)
		{
			//cerr<<depth<<" "<<a<<" "<<b<<endl;
			//左側はより右側を見る
			if((a&1)==0)
				nowa+=node[a+1];
			//右側はより左側を見る
			if((b&1)==1)
				nowb+=node[b-1];
			a/=2;
			b/=2;
		}
		int ret=nowa+nowb;
		return ret;
	}

	//n番目のノードを探す
	int find(int n)
	{
		int ret=1;
		for(int i=0;i<depth;i++)
		{
			//cerr<<ret-(1<<i)<<" "<<node[ret]<<endl;
			if(n<=node[ret*2])
				ret=ret*2;
			else{
				if(node[ret*2+1]==0)
					ret=ret*2;
				else{
					n-=node[ret*2];
					ret=ret*2+1;
				}
			}
		}
		return ret-(1<<depth);
	}
};

map<ll,int> mp;
map<int,ll> rmp;

class seg2
{
	public:
	int depth;//セグ木の深さ(最上部が0）
	int size;
	vector<ll> node;//セグ木本体

	//コンストラクタ
	seg2(int n)
	{
		depth=0;
		size=1;
		while(n>size)
		{
			size*=2;
			depth++;
		}
		size*=2;
		node.resize(size,0);
		//最下段に値を入れたあとに、下の段から順番に値を入れる
		//値を入れるには自分の子の2値を参照する
		/*
		for(int i=0;i<n;i++)
			node[i+(1<<depth)]=v[i];
		
		for(int i=depth-1;i>=0;i--)
			node[i]=calc(node[i*2],node[i*2+1]);*/
	}

	//値の更新
	//node[k]にaを加える
	void update(int k,ll a)
	{
		k+=(1<<depth);//セグ木上のインデックスに読み替え
		node[k]+=a;
		while(k>1)
		{
			k/=2;
			node[k]=node[k*2]+node[k*2+1];
		}
		return;
	}
	
	//値の取得
	//閉区間[a,b]の合計値
	ll get(int a,int b)
	{
		a+=(1<<depth);
		b+=(1<<depth);
		if(a==b)
			return node[a];
		ll nowa=node[a];
		ll nowb=node[b];
		while(a/2<b/2)
		{
			//cerr<<depth<<" "<<a<<" "<<b<<endl;
			//左側はより右側を見る
			if((a&1)==0)
				nowa+=node[a+1];
			//右側はより左側を見る
			if((b&1)==1)
				nowb+=node[b-1];
			a/=2;
			b/=2;
		}
		ll ret=nowa+nowb;
		return ret;
	}

	//n番目のノードを探す
	int find(int n)
	{
		int ret=1;
		for(int i=0;i<depth;i++)
		{
			//cerr<<ret-(1<<i)<<" "<<node[ret]<<endl;
			if(n<=node[ret*2])
				ret=ret*2;
			else{
				if(node[ret*2+1]==0)
					ret=ret*2;
				else{
					n-=node[ret*2];
					ret=ret*2+1;
				}
			}
		}
		return ret-(1<<depth);
	}
};

vector<ll> a;
vector<ll> b;
bool op[200000];
int main()
{
	int q;
	cin>>q;
	segtree seg=segtree(200001);
	seg2 sumseg=seg2(200001);
	fill(op,op+200000,false);
	for(int i=0;i<q;i++)
	{
		int t;
		cin>>t;
		if(t==1)
		{
			ll aa,bb;
			cin>>aa>>bb;
			a.push_back(aa);
			b.push_back(bb);
		}else{
			op[i]=true;
		}
	}
	//入力
	vector<ll> tmp=a;
	sort(tmp.begin(),tmp.end());
	//座圧
	for(int i=0;i<tmp.size();i++)
	{
		mp[tmp[i]]=i+1;
		rmp[i+1]=tmp[i];
	}
	int cnt=0;
	ll bsum=0;
	for(int i=0;i<q;i++)
	{
		if(op[i])
		{
			ll ans=bsum;
			int ind=seg.find((cnt+1)/2);
			ans+=rmp[ind]*seg.get(0,ind)-sumseg.get(0,ind)+sumseg.get(ind,200001)-rmp[ind]*seg.get(ind,200001);
			//cerr<<ind<<" "<<seg.get(0,ind)<<" "<<seg.get(ind,200001)<<" "<<sumseg.get(0,ind)<<" "<<sumseg.get(ind,200001)<<endl;
			cout<<rmp[ind]<<" "<<ans<<endl;
		}else{
			bsum+=b[cnt];
			seg.update(mp[a[cnt]],1);
			sumseg.update(mp[a[cnt]],a[cnt]);
			cnt++;
		}
	}
	return 0;
}

Measured memory_bytes: 23788