Superb AI 公司的成员们为了打赌请客喝咖啡,发明了一款名为“Superb Dart”(超级飞镖)的新游戏。Superb Dart 的规则如下:
- 在二维平面上绘制一个飞镖盘。
- 飞镖盘是一个以具有整数坐标的点为顶点、连接这些点的线段为边所构成的图。
- 任意两个不同顶点的坐标不相同。
- 所构成的图必须是简单图(无重边)且是连通图(任意两个顶点之间始终存在路径)。
- 不同的线段之间互不相交,即使相接触,也只能在它们共享的顶点处相交(可以理解为平面图)。
- 在这样的飞镖盘上投掷飞镖时,单次投掷获得的分数与飞镖落点所在的区域面积成反比。
- 飞镖盘上包含某个点的区域,是指从该点出发,在不与飞镖盘的边相交或接触的情况下,通过路径可以到达的所有点的集合(这里的路径是指平面上的路径,而非图上的路径,它可以是曲线)。
- 面积为无限大或为 0 的情况(例如落在飞镖盘外部,或者正好落在顶点或边上)不计为有效区域,此时获得 0 分。
好奇心旺盛的 Superb AI 成员们很想知道在这样的飞镖盘上可能获得的分数组合。为了解决这个疑问,他们决定首先在给定飞镖盘的情况下,计算出飞镖盘上各个区域的面积。
输入格式
第一行给出飞镖盘的顶点数和边数 $N, M$ ($1 \le N, M \le 100\,000$)。每个顶点按顺序编号为 $1$ 到 $N$,每条边按顺序编号为 $1$ 到 $M$。
接下来的 $N$ 行给出顶点的坐标。其中第 $i$ 行给出第 $i$ 个顶点的 $x$ 坐标和 $y$ 坐标,用空格隔开。不会给出重复的坐标。($-10^6 \le x, y \le 10^6$)
接下来的 $M$ 行给出飞镖盘的边。其中第 $i$ 行给出第 $i$ 条边的两个端点 $s, e$。两个端点互不相同,任意两条不同的边不会连接同一对顶点,且最多只有一个交点。如果任意两条不同的边有交点,则这两条边共享一个端点,且它们的交点正是该共享的端点。($1 \le s, e \le N, s \neq e$)
保证给定的飞镖盘是连通的。
输出格式
第一行输出飞镖盘中有效区域(面积大于 0 且有限的情况)的数量 $S$。
接下来的 $S$ 行,将这些区域的面积四舍五入保留一位小数,并按升序输出。
样例
输入样例 1
5 6 0 0 0 1 0 3 1 1 1 3 1 2 2 3 1 4 2 4 4 5 3 5
输出样例 1
2 0.5 2.0
输入样例 2
10 13 2 0 6 4 8 6 2 6 4 2 8 2 0 2 10 2 12 2 12 6 3 2 1 7 10 8 3 6 5 6 2 6 9 10 4 7 6 8 8 9 4 5 1 5 3 4
输出样例 2
4 4.0 4.0 12.0 16.0