← Home
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)
}