#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define x first
#define y second
using namespace std;
using PDD = pair<double, double>;
const double g = 9.8;
const int N = 100010;
struct Point {
double alp; int id;
bool operator < (const Point& tmp)const {
return tmp.alp > alp;
}
}p[N];
int n, m;
double v, vx;
PDD w[N], ans[N];
double get(double x, double alpha) {
double vx = v * cos(alpha), t = x / vx;
return v * sin(alpha) * t - g * t * t / 2.0;
}
void get(double alp, PDD &ans) {
ans = {2.0 * sin(alp) * cos(alp) * v * v / g, 0};
}
int main() {
scanf("%d%lf", &n, &v);
for (int i = 1; i <= n; i ++ )
scanf("%lf", &p[i].alp), p[i].id = i;
sort(p + 1, p + n + 1);
scanf("%d", &m);
for (int i = 1; i <= m; i ++ )
scanf("%lf%lf", &w[i].x, &w[i].y);
sort(w + 1, w + m + 1);
int now = 1; // 上一个炮弹打到的墙的下标
for (int i = 1; i <= n; i ++ ) {
double alp = p[i].alp; int id = p[i].id;
if (now == n + 1) { get(alp, ans[id]); continue; }
double h; // 炮弹在 w[now].x 的高度
for (; ; now ++ ) {
if (now == n + 1) break;
h = get(w[now].x, alp);
if (h <= w[now].y) break;
}
if (now == n + 1 || h <= 0) { get(alp, ans[id]); continue; } // 能够成功落地
ans[id] = {w[now].x, get(w[now].x, alp)}; // 撞墙
}
for (int i = 1; i <= n; i ++ )
printf("%.9lf %.9lf\n", ans[i].x, ans[i].y);
return 0;
}