#include <bits/stdc++.h>
using namespace std;
struct dat{
  int T,t,f,lap;
  dat(){T=t=f=lap=0;}
  vector<dat> V;
  bool operator < (const dat &a)const{return T<a.T;}
  bool operator > (const dat &a)const{return T>a.T;}
};

double Pos(const dat &a){return 1.0*a.t/a.T;}
bool onFront(const dat &a,const dat &b){return a.f==b.f&&Pos(a) < Pos(b);}
bool checkJam(const dat &a,const dat &b){return onFront(a,b)&&a.T-a.t<b.T-b.t;}


bool merge(vector<dat>&A,int idx){
  int in = -1,mx=-1;
  for(int i=0;i<(int)A.size();i++){
    dat &a = A[idx],&b = A[i];
    if(checkJam(a,b)&&b.T-b.t>mx)in=i,mx = b.T-b.t;
  }
  if(in!=-1){  
    dat &a=A[idx],&b=A[in];
    a.t=0,a.lap-=a.f,a.f=!a.f;
    b.V.push_back(a);
    A.erase(A.begin()+idx);
    return 1;
  }
  
  return 0;
}

void Push(vector<dat>&A,dat &a){
  for(int i=0;i<(int)a.V.size();i++)Push(A,a.V[i]);
  a.V.clear();
  if(a.lap) A.push_back(a);
}

void pr(dat &a){cout<<a.T<<" "<<a.t<<" "<<a.f<<" "<<a.lap<<" "<<a.V.size()<<endl;}

int sim(vector<dat> A){
  int res=0;
  while(!A.empty()){
    sort(A.begin(),A.end(),greater<dat>());
    
    // for(int i=0;i<A.size();i++)pr(A[i]);
    int mn = 1e9;
    for(int i=A.size()-1;i>=0;i--)
      if(!merge(A,i))mn=min(mn,A[i].T-A[i].t);
    
    //    cout<<"res="<<res<<endl,cout<<"mn="<<mn<<endl;for(int i=0;i<A.size();i++)pr(A[i]);cout<<"-------------"<<endl;
    vector<dat>nA;
    for(int i=0;i<(int)A.size();i++)
      if(A[i].t+mn<A[i].T) A[i].t+=mn,nA.push_back(A[i]);
      else A[i].t=0, A[i].lap-=A[i].f, A[i].f=!A[i].f,Push(nA,A[i]);

    A=nA;
    res+=mn;
  }
  return res;
}

int main(){
  int n;
  while(cin>>n,n){
    vector<dat> A(n);
    for(int i=0;i<n;i++)cin>>A[i].T>>A[i].lap;
    cout<<sim(A)<<endl;
  }
  return 0;
}