1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
using namespace std;
#include <iostream>
#include <vector>
#include <utility>
#include <map>

struct mina
{
    long long a,r;
    vector<int> blisk; //miny ktore sa w polu razenia
};

map<int, bool> boom;
vector<mina> miny;

void chain(int a)//simulate a chain of booms
{
    boom[a] = 1;

    for(int i=0; i<miny[a].blisk.size(); i++)
    {
        if(boom.count(miny[a].blisk[i]) == 0)
        {
            chain(miny[a].blisk[i]);
        }
    }
}


int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        long long a,r;
        cin>>a>>r;
        mina M;
        M.a = a;
        M.r = r;
        miny.push_back(M);
    }

    for(int i=0; i<n; i++)
    {
        int sumd = - miny[i].a;
        for(int j=i+1; j<n; j++)
        {
            if(miny[i].r >= sumd + miny[j].a)
            {
                miny[i].blisk.push_back(j);
            }
            else
            {
                break;
            }
        }

        sumd = miny[i].a;
        for(int j=i-1; j>=0; j--)
        {
            if(miny[i].r >= sumd - miny[j].a)
            {
                miny[i].blisk.push_back(j);
            }
            else
            {
                break;
            }
        }

    }

    vector<map<int,bool> > zbiory;

    for(int i=0; i<n; i++)
    {
        boom.clear();
        chain(i);
        zbiory.push_back(boom);
    }

    long long maxbit = 1<<n;

    map<map<int,bool>, bool> wszystkie;
    for(long long i=1; i<maxbit; i++)
    {
		long long k=1;
        map<int, bool> sboom;
        for(int j=0; j<n; j++)
        {   
            if( i & k )
            {
                sboom.insert(zbiory[j].begin(),zbiory[j].end());
            }
            
            k<<=1;
        }
        
        
        wszystkie[sboom]=1;

    }

    cout<<wszystkie.size()+1;
    
    return 0;
}