#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long double ld; typedef long long ll; typedef vector vint; typedef pair pii; typedef pair pll; typedef pair pdd; typedef complex compd; #define rep(i,n) for(int i=0;i=0;i--) #define RREP(i,n) for(int i=n;i>=0;i--) #define all(a) (a).begin(),(a).end() #define mp(a,b) make_pair(a,b) #define mt make_tuple #define fst first #define scn second #define bicnt(x) __buildin__popcount(x) #define debug(x) cout<<"debug: "< s[2]; vector a, b; void search(int i, int e, int t, ll val) { if (i == e) s[t].push_back(val); else { search(i + 1, e, t, val + a[i]); search(i + 1, e, t, val - b[i]); } } int main() { int n; cin >> n; a.resize(n); b.resize(n); rep(i, n) cin >> a[i] >> b[i]; int n2 = n / 2; s[0].reserve(1 << (n2 + 1)); s[1].reserve(1 << (n2 + 1)); search(0, n2, 0, 0LL); search(n2, n, 1, 0LL); sort(all(s[0])); sort(all(s[1])); int m = s[0].size(); ll ret = inf; rep(i, m) { int j = lower_bound(s[1].begin(), s[1].end(), -s[0][i]) - s[1].begin(); if (j > 0) ret = min(ret, llabs(s[0][i] + s[1][j - 1])); if (j < s[1].size()) ret = min(ret, llabs(s[0][i] + s[1][j])); } cout << ret << endl; return 0; }