package main
import (
"bufio"
"os"
"sort"
)
type Pair struct {
a, b int64
}
type FastScanner struct {
r *bufio.Reader
}
func NewFastScanner(r *bufio.Reader) *FastScanner {
return &FastScanner{r: r}
}
func (fs *FastScanner) NextInt64() int64 {
var sign int64 = 1
var val int64 = 0
c, _ := fs.r.ReadByte()
for (c < '0' || c > '9') && c != '-' {
c, _ = fs.r.ReadByte()
}
if c == '-' {
sign = -1
c, _ = fs.r.ReadByte()
}
for c >= '0' && c <= '9' {
val = val*10 + int64(c-'0')
c2, err := fs.r.ReadByte()
if err != nil {
break
}
c = c2
}
return val * sign
}
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
fs := NewFastScanner(in)
n := int(fs.NextInt64())
p := make([]Pair, n)
for i := 0; i < n; i++ {
p[i].a = fs.NextInt64()
p[i].b = fs.NextInt64()
}
sort.Slice(p, func(i, j int) bool { return p[i].b < p[j].b })
l, r := 0, n-1
var bought int64 = 0
var ans int64 = 0
for l <= r {
if p[l].a == 0 {
l++
continue
}
if p[r].a == 0 {
r--
continue
}
if bought >= p[l].b {
ans += p[l].a
bought += p[l].a
p[l].a = 0
continue
}
need := p[l].b - bought
take := p[r].a
if take > need {
take = need
}
ans += 2 * take
bought += take
p[r].a -= take
}
writer := bufio.NewWriter(os.Stdout)
writer.WriteString(intToString(ans))
writer.WriteByte('\n')
writer.Flush()
}
func intToString(x int64) string {
if x == 0 {
return "0"
}
buf := make([]byte, 0, 20)
neg := x < 0
if neg {
x = -x
}
for x > 0 {
buf = append(buf, byte('0'+x%10))
x /= 10
}
if neg {
buf = append(buf, '-')
}
for i, j := 0, len(buf)-1; i < j; i, j = i+1, j-1 {
buf[i], buf[j] = buf[j], buf[i]
}
return string(buf)
}