#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 10000;
const long double PI = acosl(-1.0);
template <typename T>
struct Pt {
  T x, y;
  Pt() {}
  Pt(T _x, T _y) : x(_x), y(_y) {}
  Pt(const Pt<T> &p) : x(p.x), y(p.y) {}
  Pt<T> operator+(const Pt<T> p) const { return Pt<T>(x + p.x, y + p.y); }
  Pt<T> operator-() const { return Pt<T>(-x, -y); }
  Pt<T> operator-(const Pt<T> p) const { return Pt<T>(x - p.x, y - p.y); }
  Pt<T> operator*(T t) const { return Pt<T>(x * t, y * t); }
  Pt<T> operator/(T t) const { return Pt<T>(x / t, y / t); }
  T dot(Pt<T> v) const { return x * v.x + y * v.y; }
  T cross(Pt<T> v) const { return x * v.y - y * v.x; }
  Pt<T> rot(long double th) {
    long double c = cosl(th), s = sinl(th);
    return Pt<T>(c * x - s * y, s * x + c * y);
  }
  bool operator==(const Pt<T> pt) const { return x == pt.x && y == pt.y; }
  bool operator<(const Pt<T> &pt) const {
    return x < pt.x || (x == pt.x && y < pt.y);
  }
};
Pt<long double> ps[MAX_N];
int ts[2];
int main() {
  int n, q;
  scanf("%d%d", &n, &q);
  for (int i = 0; i < n; i++) scanf("%Lf%Lf", &ps[i].x, &ps[i].y);
  Pt<long double> g(0.0, 0.0);
  long double ssum = 0.0;
  for (int i = 1; i + 1 < n; i++) {
    Pt<long double> v0(ps[i] - ps[0]), v1(ps[i + 1] - ps[0]);
    long double s = abs(v0.cross(v1));
    g = g + (ps[0] + ps[i] + ps[i + 1]) / 3 * s;
    ssum += s;
  }
  g = g / ssum;
  for (int i = 0; i < n; i++) ps[i] = ps[i] - g;
  long double th = 0.0;
  ts[0] = 0, ts[1] = 1;
  while (q--) {
    int op;
    scanf("%d", &op);
    if (op == 1) {
      int f, t;
      scanf("%d%d", &f, &t);
      f--, t--;
      int k0 = (ts[0] == f ? 1 : 0), k1 = k0 ^ 1;
      Pt<long double> v0 = ps[ts[k0]].rot(th);
      long double dth = PI / 2 - atan2l(v0.y, v0.x);
      g = g - (v0.rot(dth) - v0);
      th += dth;
      ts[k1] = t;
    } else {
      int v;
      scanf("%d", &v);
      v--;
      Pt<long double> q = ps[v].rot(th) + g;
      printf("%.10Lf %.10Lf\n", q.x, q.y);
    }
  }
  return 0;
}
