#include <bits/stdc++.h>
using namespace std;
const long double EPS = 1e-10;
struct vec {
  long double x, y;
  vec() { x = y = 0; }
  vec(long double x, long double y) {
    this->x = x;
    this->y = y;
  }
  vec operator-(const vec other) const { return vec(x - other.x, y - other.y); }
  vec operator+(const vec other) const { return vec(x + other.x, y + other.y); }
  vec operator/(const long double a) const { return vec(x / a, y / a); }
  vec operator*(const long double a) const { return vec(x * a, y * a); }
  long double operator*(const vec other) const {
    return x * other.x + y * other.y;
  }
  long double operator^(const vec other) const {
    return x * other.y - other.x * y;
  }
};
int N, Q;
vec poly[10005];
vec centroid;
vector<int> pinned;
long double norm(vec a) { return sqrt(a.x * a.x + a.y * a.y); }
long double calculateArea() {
  long double area = 0;
  for (int i = 0; i < N; i++)
    area += poly[i].x * poly[(i + 1) % N].y - poly[(i + 1) % N].x * poly[i].y;
  return abs(area) / 2;
}
vec calculateCentroid() {
  vec centroid(0, 0);
  for (int i = 0; i < N; i++) {
    centroid.x +=
        (poly[i].x + poly[(i + 1) % N].x) *
        (poly[i].x * poly[(i + 1) % N].y - poly[(i + 1) % N].x * poly[i].y);
    centroid.y +=
        (poly[i].y + poly[(i + 1) % N].y) *
        (poly[i].x * poly[(i + 1) % N].y - poly[(i + 1) % N].x * poly[i].y);
  }
  long double A = calculateArea();
  centroid.x /= 6 * A;
  centroid.y /= 6 * A;
  return centroid;
}
bool ccw(vec a, vec b, vec c) { return ((a - b) ^ (c - b)) > 0; }
vec rotatePoint(vec a, long double angle) {
  return vec(a.x * cos(angle) - a.y * sin(angle),
             a.x * sin(angle) + a.y * cos(angle));
}
vec calculateLocation(int x, vec vx, vec cent, int pos) {
  if (pos == x) return vx;
  long double angle =
      acos(max(min((long double)1,
                   (centroid - poly[x]) * (poly[pos] - poly[x]) /
                       norm(centroid - poly[x]) / norm(poly[pos] - poly[x])),
               (long double)-1));
  long double rAngle = -angle;
  if (!ccw(poly[x], centroid, poly[pos])) rAngle = angle;
  vec location = rotatePoint(cent - vx, rAngle);
  location = location / norm(centroid - poly[x]);
  location = location * norm(poly[pos] - poly[x]);
  return location + vx;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> N >> Q;
  for (int i = 0; i < N; i++) cin >> poly[i].x >> poly[i].y;
  pinned.push_back(0);
  pinned.push_back(1);
  vec shift(poly[0].x, poly[1].y);
  for (int i = 0; i < N; i++) poly[i].x -= shift.x, poly[i].y -= shift.y;
  centroid = calculateCentroid();
  vec currV0 = poly[0], currCent = centroid;
  for (int i = 0; i < Q; i++) {
    int type;
    cin >> type;
    if (type == 1) {
      int f, t;
      cin >> f >> t;
      f--;
      t--;
      for (auto i = pinned.begin(); i != pinned.end(); ++i) {
        if (*i == f) {
          pinned.erase(i);
          break;
        }
      }
      if (pinned.size() == 1) {
        vec pinV = calculateLocation(0, currV0, currCent, pinned[0]);
        vec newCent = vec(pinV.x, pinV.y);
        newCent.y -= norm(centroid - poly[pinned[0]]);
        currCent = newCent;
        currV0 = calculateLocation(pinned[0], pinV, currCent, 0);
      }
      pinned.push_back(t);
    } else {
      int v;
      cin >> v;
      v--;
      vec loc = shift + calculateLocation(0, currV0, currCent, v);
      cout << fixed << setprecision(10) << loc.x << " ";
      cout << fixed << setprecision(10) << loc.y << "\n";
    }
  }
  return 0;
}
