#include <bits/stdc++.h>
using namespace std;
struct vec2 {
  double x, y;
  vec2() {}
  vec2(double _x, double _y) : x(_x), y(_y) {}
  vec2(vec2 p1, vec2 p2) : x(p2.x - p1.x), y(p2.y - p2.y) {}
  friend ostream &operator<<(ostream &out, vec2 v);
  vec2 operator+(vec2 v) { return vec2(x + v.x, y + v.y); }
  vec2 operator-() { return vec2(-x, -y); }
  vec2 operator-(vec2 v) { return vec2(x - v.x, y - v.y); }
  double dot(vec2 v) { return x * v.x + y * v.y; }
};
ostream &operator<<(ostream &out, vec2 v) { out << v.x << ' ' << v.y; }
struct vec3 {
  double x, y, z;
  vec3() {}
  vec3(double _x, double _y, double _z) : x(_x), y(_y), z(_z) {}
  vec3(vec2 v, double _z) : x(v.x), y(v.y), z(_z) {}
  friend ostream &operator<<(ostream &out, vec3 v);
  vec3 operator-() { return vec3(-x, -y, -z); }
};
ostream &operator<<(ostream &out, vec3 v) {
  out << v.x << ' ' << v.y << ' ' << v.z;
}
struct mat3 {
  double r[3][3]{};
  mat3() { r[0][0] = r[1][1] = r[2][2] = 1; }
  mat3(double a[3][3]) {
    for (int i = 0; i < 3; ++i)
      for (int j = 0; j < 3; ++j) r[i][j] = a[i][j];
  }
  mat3 translate(vec2 t) {
    mat3 tr;
    tr.r[0][2] = t.x;
    tr.r[1][2] = t.y;
    return tr * *this;
  }
  mat3 rotate(double theta) {
    mat3 ro;
    ro.r[0][0] = ro.r[1][1] = cos(theta);
    ro.r[0][1] = -sin(theta);
    ro.r[1][0] = sin(theta);
    return ro * *this;
  }
  mat3 rotate(double theta, vec2 point) {
    return this->translate(-point).rotate(theta).translate(point);
  }
  mat3 operator*(mat3 m) {
    double n[3][3];
    for (int i = 0; i < 3; ++i) {
      for (int j = 0; j < 3; ++j) {
        n[i][j] = 0;
        for (int k = 0; k < 3; ++k) {
          n[i][j] += r[i][k] * m.r[k][j];
        }
      }
    }
    return mat3(n);
  }
  vec3 operator*(vec3 v) {
    double d1 = r[0][0] * v.x + r[0][1] * v.y + r[0][2] * v.z;
    double d2 = r[1][0] * v.x + r[1][1] * v.y + r[1][2] * v.z;
    double d3 = r[2][0] * v.x + r[2][1] * v.y + r[2][2] * v.z;
    return vec3(d1, d2, d3);
  }
  friend ostream &operator<<(ostream &out, mat3 m);
};
ostream &operator<<(ostream &out, mat3 m) {
  for (int i = 0; i < 3; ++i) {
    if (i > 0) out << endl;
    for (int j = 0; j < 3; ++j) out << (j == 0 ? "" : " ") << m.r[i][j];
  }
}
double area(vector<vec2> &polygon) {
  double res = 0;
  int n = polygon.size();
  int j = n - 1;
  for (int i = 0; i < n; ++i) {
    res += (polygon[j].x + polygon[i].x) * (polygon[j].y - polygon[i].y);
    j = i;
  }
  return abs(res / 2);
}
vec2 centroid(vector<vec2> &polygon) {
  double x = 0, y = 0;
  int n = polygon.size();
  int j = n - 1;
  for (int i = 0; i < n; ++i) {
    double det = polygon[j].x * polygon[i].y - polygon[i].x * polygon[j].y;
    x += (polygon[j].x + polygon[i].x) * det;
    y += (polygon[j].y + polygon[i].y) * det;
    j = i;
  }
  double sgfrea = area(polygon);
  x /= 6 * sgfrea;
  y /= 6 * sgfrea;
  return vec2(x, y);
}
int main() {
  iostream::sync_with_stdio(0);
  int n, q, in;
  long long x, y;
  cin >> n >> q;
  vector<vec2> poly;
  vec2 first;
  for (int i = 0; i < n; ++i) {
    cin >> x >> y;
    if (i == 0) first = vec2(x, y);
    poly.push_back(vec2(x, y) - first);
  }
  vec2 c = centroid(poly);
  mat3 tr;
  int a = 1, b = 2;
  while (q--) {
    cin >> in;
    if (in == 1) {
      int f, t;
      vec3 point;
      cin >> f >> t;
      if (f == a) {
        point = tr * vec3(poly[b - 1], 1);
        a = t;
      } else {
        point = tr * vec3(poly[a - 1], 1);
        b = t;
      }
      vec3 curr = tr * vec3(c, 1);
      double theta =
          -atan2(curr.y - point.y, curr.x - point.x) - acos(-1.0) / 2;
      tr = tr.rotate(theta, vec2(point.x, point.y));
    } else if (in == 2) {
      int i;
      cin >> i;
      vec3 ans = tr * vec3(poly[i - 1], 1);
      cout << fixed << setprecision(10) << ans.x + first.x << ' '
           << ans.y + first.y << endl;
    }
  }
}
