```c++
#include<bits/stdc++.h>
using namespace std;
const int N = 205;
int n, m;
struct Point {
int x, y;
double det() {
return sqrt((double)x * x + y * y);
}
Point operator+() {
}
} p[N];
Point operator-() {
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
scanf("%d%d", &p[i].x, &p[i].y);
for (int i = 1; i <= m; ++i) {
int op, r, s;
scanf("%d%d", &op, &r);
if (op != 1)
scanf("%d", &s);
if (op == 1) {
printf("%.2lf\n", p[r].det());
} else if (op == 2) {
Point t = p[r] + p[s];
printf("%d %d\n", t.x, t.y);
} else if (op == 3) {
Point t = p[r] - p[s];
printf("%d %d\n", t.x, t.y);
} else if (op == 4) {
printf("%d\n", dot(p[r], p[s]));
} else if (op == 5) {
printf("%d\n", cross(p[r], p[s]));
} else if (op == 6) {
printf("%.2lf\n", dis(p[r], p[s]));
}
}
return 0;
}
# 计算几何初探
## 题目描述
本题是代码填空题,按要求补充给出代码的空白即可通过题目。
先输入 $n$ 和 $m$,再输入 $n$ 个二维坐标(编号从 $1$ 开始),接着输入 $m$ 个询问,对其中每个询问做出一个回答。
询问包括:
- ` 1 r` 求第 $r$ 个坐标对应的向量的模长(模长公式 $\sqrt{x_r^2+y_r^2}$)。
- ` 2 r s` 求第 $r$ 个坐标对应的向量和第 $s$ 个坐标对应的向量的加法结果(加法公式 $(x_r,y_r)+(x_s,y_s)=(x_r+x_s,y_r+y_s)$)。
- `3 r s` 求第 $r$ 个坐标对应的向量和第 $s$ 个坐标对应的向量的减法结果(减法公式 $(x_r,y_r)-(x_s,y_s)=(x_r-x_s,y_r-y_s)$)。
- `4 r s` 求第 $r$ 个坐标对应的向量和第 $s$ 个坐标对应的向量的点乘结果(点乘公式 $(x_r,y_r) \cdot (x_s,y_s)=x_rx_s+y_r y_s$)。
- `5 r s` 求第 $r$ 个坐标对应的向量和第 $s$ 个坐标对应的向量的叉乘结果(叉乘公式 $(x_r,y_r) \times (x_s,y_s)=x_ry_s-y_rx_s$)。
- `6 r s` 求点 $r$ 和点 $s$ 之间的距离(距离公式 $\sqrt{(x_r-x_s)^2+(y_r-y_s)^2}$)。
## 输入格式
从标准输入读入数据。
第一行输入两个正整数 $n,m$($n,m\le 100$)。
接下来 $n$ 行每行输入两个整数 $x,y$($-1000\le x,y\le 1000$),表示两个坐标。
接下来 $m$ 行每行输入一个询问,格式见题面。
## 输出格式
输出到标准输出。
对于每个询问,回答一行。
如果答案是一个数量,直接输出;如果答案是一个二维向量(或二维坐标),按先 $x$ 后 $y$ 的顺序输出该坐标。
对于第 $1$ 类和第 $6$ 类询问输出保留 $2$ 位小数。
## 样例 #1
### 样例输入 #1
3 6
1 1
2 3
3 2
1 2
2 1 2
3 1 2
4 1 2
5 1 2
6 2 3
### 样例输出 #1
3.61
3 4
-1 -2
5
1
1.41
```