#include <bits/stdc++.h>
using namespace std;
long double Area(long double dX0, long double dY0, long double dX1,
                 long double dY1, long double dX2, long double dY2) {
  long double dArea =
      ((dX1 - dX0) * (dY2 - dY0) - (dX2 - dX0) * (dY1 - dY0)) / 2.0;
  return (dArea > 0.0) ? dArea : -dArea;
}
pair<long double, long double> compute2DPolygonCentroid(
    vector<long double> xvertices, vector<long double> yvertices,
    int vertexCount) {
  if (vertexCount == 1) return {xvertices[1], yvertices[1]};
  if (vertexCount == 2)
    return {(xvertices[1] + xvertices[2]) / 2.0,
            (yvertices[1] + yvertices[2]) / 2.0};
  long double bax = 0, bay = 0;
  long double sumArea = 0;
  for (int i = 3; i <= vertexCount; ++i) {
    long double a = Area(xvertices[i], yvertices[i], xvertices[i - 1],
                         yvertices[i - 1], xvertices[1], yvertices[1]);
    sumArea += a;
    bax += (xvertices[i] + xvertices[i - 1] + xvertices[1]) * a / 3.0;
    bay += (yvertices[i] + yvertices[i - 1] + yvertices[1]) * a / 3.0;
  }
  bax /= sumArea;
  bay /= sumArea;
  return {bax, bay};
}
pair<long double, long double> query() {}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.precision(17);
  long long n, q;
  cin >> n >> q;
  vector<long double> x(n + 5), y(n + 5);
  for (int i = 1; i <= n; ++i) cin >> x[i] >> y[i];
  long double bx = 0, by = 0;
  pair<long double, long double> baricenter;
  if (n != 1)
    baricenter = compute2DPolygonCentroid(x, y, n);
  else
    baricenter = {x[1], y[1]};
  bx = baricenter.first;
  by = baricenter.second;
  long long pina = 1, pinb = 2;
  vector<pair<long double, long double>> baricentric(n + 10);
  for (int i = 1; i <= n; ++i) {
    long double rho =
        sqrt((x[i] - bx) * (x[i] - bx) + (y[i] - by) * (y[i] - by));
    long double xdes = (x[i] - bx);
    long double ydes = (y[i] - by);
    long double theta;
    theta = atan2(ydes, xdes);
    if (theta < 0) theta += 8.0 * atan(1);
    long double xstand = bx + rho * cos(theta);
    long double ystand = by + rho * sin(theta);
    baricentric[i] = {rho, theta};
  }
  bool did = false;
  long long standing = 0;
  for (int i = 0; i < q; ++i) {
    long long type;
    cin >> type;
    if (type == 1) {
      long long f, t;
      cin >> f >> t;
      long long h = pina;
      if (h == f) h = pinb;
      long double xstand, ystand;
      if (!did) {
        xstand = x[h];
        ystand = y[h];
      } else {
        double thetar =
            baricentric[h].second - baricentric[standing].second + 2 * atan(1);
        while (thetar < 0) {
          thetar += 8 * atan(1);
        }
        double rho = baricentric[h].first;
        xstand = bx + rho * cos(thetar);
        ystand = by + rho * sin(thetar);
      }
      did = true;
      standing = pina;
      if (standing == f) standing = pinb;
      double rho = baricentric[standing].first;
      bx = xstand;
      by = ystand - rho;
      if (pina == f)
        pina = t;
      else
        pinb = t;
    } else {
      long long point;
      cin >> point;
      if (!did) {
        cout << x[point] << " " << y[point] << '\n';
      } else {
        double thetar = baricentric[point].second -
                        baricentric[standing].second + 2 * atan(1);
        while (thetar < 0) {
          thetar += 8 * atan(1);
        }
        double rho = baricentric[point].first;
        double xs = bx + rho * cos(thetar);
        double ys = by + rho * sin(thetar);
        cout << xs << " " << ys << '\n';
      }
    }
  }
  return 0;
}
