Problem:
問題文

委員長の魔女 PATRICIA は，蜘蛛のような糸を吐き結界の中で暮らしている．使い魔の MATHIEU は，委員長の魔女が吐いた糸を引っぱり自在に空を飛んでいる．糸は空間上の線分とみなすことにする．

暁美ほむらは委員長の魔女に対して攻撃を仕掛けようとし，爆弾と間違えて花火玉を投げ込んでしまった．その結果，それぞれの糸について，魔女から距離 p_1, ..., p_M の位置にある部分が切れるだけとなってしまった．花火玉を投げる前，それぞれの糸について，糸の 2 つの端点と魔女はこの順番で同一直線上に並んでおり，端点のどちらか一方を使い魔が引っ張っていた．爆発で糸は切れ，使い魔が持っていた部分とそこから一つ置きの部分を残して糸の一部は消えてしまった．

ほむらは次の戦略を考えるために，残った糸についての情報が知りたいと思っている．残った糸の長さの合計値を求めよ．

入力形式

入力は以下の形式で与えられる．

N\ M\\
s_1\ t_1\\
...\\
s_N\ t_N\\
p_1\\
...\\
p_M\\

N は空間上の糸の個数，M は花火玉によって発生した糸の切断の箇所の個数である．

s_i, t_i は糸の情報であり，s_i は使い間が引っ張っていた側の端点，t_i はそうでない側の端点の魔女からの距離である．

p_i は花火玉によって切断された位置の情報である．

出力形式

花火玉を投げた後，残った糸の長さの合計値を1行に出力せよ．

制約

1 ≤ N ≤ 105

1 ≤ M ≤ 105

1 ≤ s_i ≤ 10^9

1 ≤ t_i ≤ 10^9

1 ≤ p_i ≤ 10^9

入力値は全て整数である．

s_1, ..., s_N, t_1, ..., t_N, p_1, ..., p_M は全て相異なる．

入出力例

入力例 1

2 3
1 8
20 5
3
7
15

出力例1

10

爆発の後，1 つ目のひもは端点の魔女からの距離がそれぞれ (1,3), (7,8) の 2 つのひもに，2 つ目のひもは (20, 15), (7, 5) の 2 つのひもに分かれる．結果，残ったひもの長さの合計は 2+1+5+2 = 10 となる．

入力例 2

1 1
100 1
70

出力例 2

30

入力例 3

6 8
1 10
11 23
99 2
56 58
66 78
88 49
5
15
25
35
45
55
65
75

出力例 3

99

Problem Setter: Flat35

Solution in C (judge verdict: Accepted)

// AOJ 2317 Class Representative Witch
// 2018.4.11 bal4u

#include <stdio.h>
#include <stdlib.h>

//#define getchar_unlocked()  getchar()
int in()
{
	int n = 0, c = getchar_unlocked();
	do n = 10*n + (c & 0xf), c = getchar_unlocked(); while (c >= '0');
	return n;
}

int N, M;
int s[100002], t[100002];
int p[100002], a[100002];
int even[100002], odd[100002];

// 見つからなければ、小さい要素のうちの最大を返す
int bisearch_LE(int x)
{
	int m, l = 0, r = M;

    while (l < r) {
        m = (l+r) >> 1;
//		if (p[m] == x) return m;
        if (p[m] < x) l = m + 1; else r = m;
    }
	return l-1;
}

// 見つからなければ、大きい要素のうちの最小を返す
int bisearch_GE(int x)
{
	int m, l = 0, r = M;

    while (l < r) {
        m = (l+r) >> 1;
        if (p[m] < x) l = m + 1; else r = m;
    }
	return l;
}

int cmp(int *a, int *b) { return *a - *b; }

int main()
{
	int i, j, k, mi, ma, f;
	long long ans;

	N = in(), M = in()+1;
	for (i = 0; i < N; i++) s[i] = in(), t[i] = in();
	p[0] = 0;
	for (i = 1; i < M; i++) p[i] = in();
	qsort(p, M, sizeof(int), cmp);
	p[M++] = 1000000002;
	for (i = 1; i < M; i++) a[i] = p[i]-p[i-1];

	even[0] = 0;
	for (i = 1; i < M; i++) {
		if (i & 1) odd [i] = odd [i-1]+a[i], even[i] = even[i-1];
		else       even[i] = even[i-1]+a[i], odd [i] = odd [i-1];
	}

	ans = 0;
	for (i = 0; i < N; i++) {
		if (s[i] < t[i]) f = 0, mi = s[i], ma = t[i];
		else             f = 1, ma = s[i], mi = t[i];
		if (f) {
			j = bisearch_LE(ma), k = bisearch_GE(mi);
			if (p[k] >= ma) ans += ma-mi;
			else {
				ans += ma-p[j];
				if ((k&1) ^ (j&1)) ans += p[k]-mi, k++;
				if (j&1) ans += even[j]-even[k];
				else     ans += odd [j]-odd [k];
			}
		} else {
			j = bisearch_GE(mi), k = bisearch_LE(ma);
			if (p[j] >= ma) ans += ma-mi;
			else {
				ans += p[j]-mi;
				if ((k&1) ^ (j&1)) ans += ma-p[k];
				if (j&1) { if (k > j) ans += odd [k]-odd [j+1]; }
				else     { if (k > j) ans += even[k]-even[j+1]; }
			}
		}
	}
	printf("%lld\n", ans);
	return 0;
}