#include <bits/stdc++.h>
using namespace std;
struct rec {
  double x, y;
} d[100100], pr[10100];
struct data {
  int a;
  double b;
} ys[10100];
int pos, v, n, m, i, last;
double t, jd[10100];
inline double f(int a) {
  double t, y;
  t = d[a].x / (cos(ys[pos].b) * v);
  y = t * (v * sin(ys[pos].b) - 9.8 * t * 0.5);
  return y;
}
inline double dp(double a, double b) {
  double t, ans, p;
  t = b / (cos(a) * v);
  ans = t * (v * (p = sin(a)) - 4.9 * t);
  return ans;
}
inline bool cmp(const rec &a, const rec &b) {
  return a.x < b.x || (abs(a.x - b.x) < 0.0000000001 && a.y < b.y);
}
inline bool cmp1(const data &a, const data &b) { return a.b < b.b; }
int main() {
  scanf("%d%d", &n, &v);
  for (i = 1; i <= n; i++) {
    scanf("%lf", &ys[i].b);
    jd[i] = ys[i].b;
    ys[i].a = i;
  }
  sort(ys + 1, ys + n + 1, cmp1);
  scanf("%d", &m);
  for (i = 1; i <= m; i++) {
    scanf("%lf%lf", &d[i].x, &d[i].y);
  }
  sort(d + 1, d + m + 1, cmp);
  d[m + 1].x = 200000;
  d[m + 1].y = 200000;
  last = 1;
  for (pos = 1; pos <= n; pos++) {
    while (1) {
      t = dp(ys[pos].b, d[last].x);
      if (t - 0.0000000001 > d[last].y)
        last++;
      else
        break;
    }
    if (t - 0.0000000001 < 0) {
      pr[ys[pos].a] = (rec){v * v * sin(2 * ys[pos].b) / 9.8, 0};
    } else
      pr[ys[pos].a] = (rec){d[last].x, t};
  }
  for (i = 1; i <= n; i++) {
    if (abs(dp(jd[i], pr[i].x) - pr[i].y) > 0.00005 + 0.0000000001) {
      while (1)
        ;
      printf("###%d %lf %lf %lf %lf %lf\n", v, ys[i].b, pr[i].x, pr[i].y,
             dp(jd[i], pr[i].x), abs(dp(ys[i].b, pr[i].x) - pr[i].y));
    }
    printf("%.6lf %.6lf\n", pr[i].x, pr[i].y);
  }
  return 0;
}
