Problem:
Problem B: 友だちの誘い方

明日から、待ちに待った夏休みが始まります。なのでわたしは、友だちを誘って、海に遊びに行くこ
とに決めました。

けれども、わたしの友だちには、恥ずかしがりやさんが多いです。その人たちは、あまり多くの人が
いっしょに来ると知ったら、きっと嫌がるでしょう。

ほかにも、わたしの友だちには、目立ちたがりやさんも多いです。その人たちは、いっしょに来る人
があまり多くないと知れば、きっと嫌がるでしょう。

それと、わたしの友だちには、いつもは目立ちたがりやなのに実は恥ずかしがりやさんな人もいま
す。その人たちは、いっしょに来る人が多すぎても少なすぎても、きっと嫌がるでしょう。

こういうのは、大勢で行った方が楽しいはずです。だからわたしは、できるだけたくさんの友だちを
誘いたいと思っています。けれども、嫌がる友だちを無理やり連れていくのはよくありません。

いったい、わたしは最大で何人の友だちを誘うことができるのでしょうか。

わたしは、こういう頭を使いそうな問題が大の苦手です。なので、あなたにお願いがあります。もし
よろしければ、わたしの代わりにこの問題を解いていただけないでしょうか。いえ、決して無理にと
は言いません。けれど、もし解いていただるのでしたら、わたしはとても嬉しいです。

Input

N

a1 b1

a2 b2

.

.

.

aN bN

入力の１行目には、整数N（1 ≤ N ≤ 100,000）が書かれている。これは、友だちの数をあらわす。

続くN行には、整数 ai と整数 bi（2 ≤ ai ≤ bi ≤ 100,001）が、空白区切りで書かれている。１＋ i 行目に書かれた整数 ai とbi は、i 番目の友だちは海に行く人数が ai 人以上 bi 人以下でないと嫌がることをあらわす。海に行く人数には「わたし」も含まれることに注意せよ。

Output

嫌がる友だちが出ないように、海に誘うことのできる友だちの最大人数を出力せよ。

Sample Input 1

4
2 5
4 7
2 4
3 6

Sample output 1

3

Sample Input 2

5
8 100001
7 100001
12 100001
8 100001
3 100001

Sample output 2

0

Sample Input 3

6
2 9
4 8
6 7
6 6
5 7
2 100001

Sample output 3

5

Solution in C++ (judge verdict: Accepted)

#include <iostream>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <bitset>
#include <numeric>
#include <climits>
#include <cfloat>
using namespace std;

class Sum
{
    int n;
    vector<int> data;
    void query(int a, int b, int k, int l, int r, int x){
        if(r < a || b < l)
            return;
        if(a <= l && r <= b)
            data[k] += x;
        else{
            query(a, b, k*2+1, l, (l+r)/2, x);
            query(a, b, k*2+2, (l+r+1)/2, r, x);
        }
    }
public:
    Sum(int n0){
        n = 1;
        while(n < n0)
            n *= 2;
        data.assign(2*n-1, 0);
    }
    void add(int a, int b, int x){
        query(a, b, 0, 0, n-1, x);
    }
    int get(int k){
        k += n-1;
        int ret = data[k];
        while(k > 0){
            k = (k - 1) / 2;
            ret += data[k];
        }
        return ret;
    }
};

int main()
{
    int n;
    cin >> n;

    Sum sum(n+2);
    for(int i=0; i<n; ++i){
        int a, b;
        cin >> a >> b;
        sum.add(a, b, 1);
    }

    int i = n;
    for(;;){
        if(sum.get(i+1) >= i){
            cout << i << endl;
            break;
        }
        -- i;
    }

    return 0;
}