#include #include using namespace std; using namespace atcoder; typedef long long ll; #define rep(i, n) for (ll i = 0; i < (ll)(n); i++) static const double pi = 3.141592653589793; const ll INF = 1LL << 60; const ll mod = 1000000007; const ll imod = 998244353; using mint = modint998244353; vector dx = {1, 0, -1, 0}, dy = {0, 1, 0, -1}; ll P(ll x, ll n) { ll ret = 1; while (n > 0) { if (n & 1) ret *= x; x *= x; n >>= 1; } return ret; } void seek(bool f){ cout << (f ? "Yes" : "No") << endl; } int main(){ ll N; cin >> N; vector A(N), B(N); rep(i, N){ cin >> A[i] >> B[i]; } ll dp[N + 1][2]; rep(i, N + 1){ rep(j, 2){ dp[i][j] = 0; } } if(A[0] == B[0]){ dp[0][0] = dp[0][1] = A[0]; } for(int i = 0; i < N; i++){ dp[i + 1][0] = max(dp[i][0], dp[i][1]); dp[i + 1][1] = max(dp[i][0], dp[i][1]); if(i < N - 1 and A[i + 1] == A[i]){ dp[i + 1][0] = max(dp[i + 1][0], dp[i][1] + A[i]); } if(i < N - 1 and A[i + 1] == B[i]){ dp[i + 1][0] = max(dp[i + 1][0], dp[i][0] + B[i]); } if(i < N - 1 and B[i + 1] == A[i]){ dp[i + 1][1] = max(dp[i + 1][1], dp[i][1] + A[i]); } if(i < N - 1 and B[i + 1] == B[i]){ dp[i + 1][1] = max(dp[i + 1][1], dp[i][0] + B[i]); } if(A[i] == B[i]){ dp[i + 1][0] += A[i]; dp[i + 1][1] += A[i]; } } cout << max(dp[N][0], dp[N][1]) << endl; }