#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
#define int ll

const int N=1e4+10;

pair< pair<int,int> , int > td[N];
int treel[N*4],treer[N*4],padd[N*4],pupd[N*4];

void build(int v,int tl,int tr)
{
    padd[v]=pupd[v]=-1;
    if(tl==tr)
        treel[v]=treer[v]=td[tl].first.first;
    else
    {
        int tm=(tl+tr)/2;
        build(v*2+1,tl,tm);
        build(v*2+2,tm+1,tr);
        treel[v]=min(treel[v*2+1],treel[v*2+2]);
        treer[v]=max(treer[v*2+1],treer[v*2+2]);
    }
}

void push(int v,int tl,int tr)
{
    if(padd[v]!=-1)
        treel[v]-=padd[v],treer[v]-=padd[v];
    if(pupd[v]!=-1)
        treel[v]=treer[v]=pupd[v];
    if(tl!=tr)
        for(int son=v*2+1;son<=v*2+2;son++)
        {
            if(padd[v]!=-1)
            {
                if(padd[son]!=-1)
                    padd[son]+=padd[v];
                if(pupd[son]!=-1)
                    pupd[son]-=padd[v];

            }
            if(pupd[v]!=-1)
                pupd[son]=pupd[v],padd[son]=-1;
        }
    pupd[v]=padd[v]=-1;
}

int get(int v,int tl,int tr,int ind)
{
    push(v,tl,tr);
    if(tl==tr)
        return treel[v];
    int tm=(tl+tr)/2;
    if(ind<=tm)
        return get(v*2+1,tl,tm,ind);
    else
        return get(v*2+2,tm+1,tr,ind);
}

void upd(int v,int tl,int tr,int l,int r)
{
    push(v,tl,tr);
    if(l>treer[v]||treel[v]>r)
        return;
    if(tl==tr)
    {
        pupd[v]=l;
        return;
    }
    int tm=(tl+tr)/2;
    push(v*2+1,tl,tm);
    push(v*2+2,tm+1,tr);
    if(l<=treel[v]&&treer[v]<=r)
    {
        pupd[v]=l;
        return;
    }
    upd(v*2+1,tl,tm,l,r);
    upd(v*2+2,tm+1,tr,l,r);
}

void add(int v,int tl,int tr,int l,int r)
{
    push(v,tl,tr);
    if(treer[v]<=r)
        return;
    if(tl==tr)
    {
        padd[v]=r-l;
        return;
    }
    int tm=(tl+tr)/2;
    push(v*2+1,tl,tm);
    push(v*2+2,tm+1,tr);
    if(treel[v]>r)
    {
        if(pupd[v]!=-1)
            pupd[v]-=r-l;
        else if(padd[v]!=-1)
            padd[v]+=r-l;
        else
            padd[v]=r-l;
        return;
    }
    upd(v*2+1,tl,tm,l,r);
    upd(v*2+2,tm+1,tr,l,r);
}

void process(int l,int r, int n)
{
    upd(0,0,n-1,l,r);
    add(0,0,n-1,l,r);
}

struct comp
{
    bool operator()(pair< pair<int,int> , int > x,pair< pair<int,int> , int > y)
    {
        return x.first.second<y.first.second;
    }
};


signed main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>td[i].first.first>>td[i].first.second;
    sort(td,td+n);
    build(0,0,n-1);
    for(int i=0;i<n;i++)
        td[i].second=i;
    sort(td,td+n,comp());
    int ans=0;
    for(int i=0;i<n;i++)
    {
        int t=get(0,0,n-1,td[i].second),d=td[i].first.second;
        cout<<t<<" "<<d<<"\n";
        if(t>=d)
            process(t-d,t,n),ans++;
    }
    cout<<ans;
}
