#include <bits/stdc++.h>
using namespace std;
const int N = 10002;
int n, q, x[N], y[N];
complex<long double> first, second, centroid, initialCentroid;
int fi, si;
bool madeT1Query;
int mnx, mny;
long double getPolygonSignedArea() {
  long long area = 1ll * x[n] * y[1] - 1ll * x[1] * y[n];
  for (int i = 1; i <= n - 1; ++i)
    area += 1ll * x[i] * y[i + 1] - 1ll * x[i + 1] * y[i];
  return area / 2.0;
}
void updateCentroid() {
  centroid = complex<long double>(
      first.real(), first.imag() - hypot((((centroid) - (first))).real(),
                                         (((centroid) - (first))).imag()));
}
complex<long double> getPolygonCentroid() {
  long double a = getPolygonSignedArea();
  long double r = 0, second = 0;
  for (int i = 1; i <= n - 1; ++i) {
    r += (long double)(x[i] + x[i + 1]) *
         ((long double)x[i] * y[i + 1] - (long double)x[i + 1] * y[i]);
    second += (long double)(y[i] + y[i + 1]) *
              ((long double)x[i] * y[i + 1] - (long double)x[i + 1] * y[i]);
  }
  r += (long double)(x[n] + x[1]) *
       ((long double)x[n] * y[1] - (long double)x[1] * y[n]);
  second += (long double)(y[n] + y[1]) *
            ((long double)x[n] * y[1] - (long double)x[1] * y[n]);
  return complex<long double>(r / 6 / a, second / 6 / a);
}
long double distance(complex<long double> first, complex<long double> second) {
  return sqrt((first.real() - second.real()) * (first.real() - second.real()) +
              (first.imag() - second.imag()) * (first.imag() - second.imag()));
}
complex<long double> solve(int u) {
  if (u == fi) return first;
  long double bc = distance(complex<long double>(x[fi], y[fi]),
                            complex<long double>(x[u], y[u]));
  long double ac =
      distance(complex<long double>(x[fi], y[fi]), initialCentroid);
  long double ab = distance(complex<long double>(x[u], y[u]), initialCentroid);
  long double angle =
      (acos(((bc) * (bc) + (ac) * (ac) - (ab) * (ab)) / (2 * (bc) * (ac))));
  if ((((conj(((complex<long double>(x[fi], y[fi])) - (initialCentroid))) *
         (((complex<long double>(x[u], y[u])) - (initialCentroid))))
            .imag()) > 1e-8))
    angle *= -1;
  complex<long double> v = ((centroid) - (first));
  v = ((((v) / distance(complex<long double>(0, 0), v))) *
       exp(complex<long double>(0, angle))) *
          bc +
      first;
  return v;
}
int main() {
  scanf("%d%d", &n, &q);
  for (int i = 1; i <= n; ++i) scanf("%d%d", &x[i], &y[i]);
  mnx = -*min_element(x + 1, x + 1 + n);
  mny = -*min_element(y + 1, y + 1 + n);
  for (int i = 1; i <= n; ++i) x[i] += mnx, y[i] += mny;
  fi = 1, si = 2;
  first = complex<long double>(x[1], y[1]);
  second = complex<long double>(x[2], y[2]);
  centroid = getPolygonCentroid();
  initialCentroid = centroid;
  while (q--) {
    int t, u, v;
    scanf("%d%d", &t, &u);
    if (t == 1) {
      scanf("%d", &v);
      if (u == fi) first = second, fi = si;
      updateCentroid();
      si = v;
      second = solve(v);
      madeT1Query = true;
    } else {
      if (madeT1Query) {
        complex<long double> ans = solve(u);
        printf("%.9LF %.9LF\n", ans.real() - mnx, ans.imag() - mny);
      } else
        printf("%d %d\n", x[u] - mnx, y[u] - mny);
    }
  }
}
