#include <bits/stdc++.h>
using namespace std;
template <class _Tp>
_Tp gcd(_Tp a, _Tp b) {
  return (b == 0) ? (a) : (gcd(b, a % b));
}
const long long Inf = 1000000000000000000ll;
const int inf = 1000000000;
char buf[1 << 25], *p1 = buf, *p2 = buf;
inline int getc() {
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 25, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
inline int read() {
  int x = 0, f = 0;
  char c = getc();
  while (!isdigit(c)) (c == '-') && (f = 1), c = getc();
  while (isdigit(c)) x = x * 10 + (c & 15), c = getc();
  return f ? -x : x;
}
namespace Geometry {
const double eps = 1e-8;
int Cmp(const double x) {
  if (fabs(x) < eps) return 0;
  return x < 0 ? -1 : 1;
}
struct Point {
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
  void read() { scanf("%lf%lf", &x, &y); }
  void print() { printf("%.10lf %.10lf", x, y); }
  bool operator<(Point rhs) const {
    return (x != rhs.x) ? (x < rhs.x) : (y < rhs.y);
  }
  double length() { return sqrt(x * x + y * y); }
  Point rotate(double rad) {
    return Point(x * cos(rad) - y * sin(rad), x * sin(rad) + y * cos(rad));
  }
};
double sqr(double x) { return x * x; }
Point operator+(Point a, Point b) { return Point(a.x + b.x, a.y + b.y); }
Point operator-(Point a, Point b) { return Point(a.x - b.x, a.y - b.y); }
Point operator*(Point a, double b) { return Point(a.x * b, a.y * b); }
Point operator/(Point a, double b) { return Point(a.x / b, a.y / b); }
bool operator==(Point a, Point b) {
  return (fabs(a.x - b.x) < eps && fabs(a.y - b.y) < eps);
}
double dot(Point a, Point b) { return a.x * b.x + a.y * b.y; }
double cross(Point a, Point b) { return a.x * b.y - a.y * b.x; }
double length(Point a) { return sqrt(dot(a, a)); }
double angle(Point a, Point b) {
  return acos(dot(a, b) / (length(a) * length(b)));
}
bool onsegment(Point p, Point a1, Point a2) {
  return (Cmp(cross(a1 - p, a2 - p) == 0) && Cmp(dot(a1 - p, a2 - p)) < 0);
}
double dis(Point a, Point b) { return sqrt(sqr(a.x - b.x) + sqr(a.y - b.y)); }
Point normal(Point a) {
  double l = length(a);
  return Point(-a.y / l, a.x / l);
}
double rad(Point a, Point b) { return atan2(cross(a, b), dot(a, b)); }
}  // namespace Geometry
using namespace Geometry;
Point Centroid(Point* st, Point* ed) {
  int n = ed - st;
  Point res = Point(0, 0);
  double S = 0;
  for (int i = 1; i < n - 1; ++i) {
    double s = fabs(cross(st[i] - st[0], st[i + 1] - st[0]));
    res = res + (st[0] + st[i] + st[i + 1]) * s / 3;
    S += s;
  }
  return res / S;
}
const int N = 10005;
int n, q;
Point p[N], o;
double ang;
int main() {
  n = read();
  q = read();
  for (int i = 1; i <= n; ++i) {
    p[i].x = read();
    p[i].y = read();
  }
  o = Centroid(p + 1, p + n + 1);
  for (int i = 1; i <= n; ++i) p[i] = p[i] - o;
  int p1 = 1, p2 = 2;
  while (q--) {
    int op = read();
    if (op == 1) {
      int f = read(), t = read();
      int oth = (f == p1) ? p2 : p1;
      Point tmp = o + p[oth].rotate(ang);
      double cur = rad(o - tmp, Point(0, -1));
      o = tmp + Point(0, -1) * p[oth].length();
      ang += cur;
      if (f == p1)
        p1 = t;
      else
        p2 = t;
    } else {
      int f = read();
      Point t = o + p[f].rotate(ang);
      t.print();
      puts("");
    }
  }
  return 0;
}
