#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 100000;

long long n;

struct ab
{
	long long a;
	long long b;
	bool operator < (const struct ab &c) const
	{
		return b < c.b;
	}
} aa[N + 5];
long long sus[N + 5];

int main()
{
	scanf("%lld", &n);
	long long su = 0;
	for (int i = 1; i <= n; ++i)
	{
		scanf("%lld%lld", &aa[i].a, &aa[i].b);
		su += aa[i].a;
	}
	sort(aa + 1, aa + n + 1);
	sus[n + 1] = 0;
	for (int i = n; i >= 1; --i)
	{
		sus[i] = sus[i + 1] + aa[i].a;
	}
	long long ans = 0;
	long long p = 0, ext = 0;
	for (int i = 1; i <= n; ++i)
	{
		long long cc = aa[i].b - (p + ext);
		if (sus[i + 1] <= ext)
		{
			if (aa[i].b <= p + ext)
			{
				ans += aa[i].a - (ext - sus[i + 1]);
			}
			else if (aa[i].b <= p + ext + aa[i].a - (ext - sus[i + 1]))
			{
				ans += p + ext + aa[i].a - (ext - sus[i + 1]) - aa[i].b;
				ans += 2 * cc;
			}
			else
			{
				ans += 2 * (aa[i].a - (ext - sus[i + 1]));
			}
			break;
		}
		else if (aa[i].b <= p + ext)
		{
			ans += aa[i].a;
			p += aa[i].a;
		}
		else if (sus[i + 1] - ext >= cc)
		{
			ans += 2 * cc;
			ext += cc;
			ans += aa[i].a;
			p += aa[i].a;
		}
		else
		{
			ans += 2 * (sus[i + 1] - ext);
			cc -= sus[i + 1] - ext;
			if (cc >= aa[i].a)
			{
				ans += 2 * aa[i].a;
			}
			else
			{
				ans += 2 * cc + (aa[i].a - cc);
			}
			break;
		}
	}
	
//	for (int i = 1; i <= n; ++i)
//	{
//		if (aa[i].b >= su)
//		{
//			ans += 2 * (su - p - ext);
//			break;
//		}
//		else if (aa[i].b <= p + ext)
//		{
//			ans += aa[i].a;
//			p += aa[i].a;
//		}
//		else if (sus[i + 1] >= aa[i].b - p)
//		{
//			ans += 2 * (aa[i].b - p - ext);
//			ext += aa[i].b - p - ext;
//			ans += aa[i].a;
//			p += aa[i].a;
//		}
//		else if (sus[i + 1] < aa[i].b - p - ext)
//		{
//			ans += 
//		}
//	}
	
	printf("%lld", ans);
	return 0;
}

