using System; using static System.Console; using System.Linq; using System.Collections.Generic; class Program { static int NN => int.Parse(ReadLine()); static long[] NList => ReadLine().Split().Select(long.Parse).ToArray(); static long[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray(); public static void Main() { Solve(); } static void Solve() { var c = NList; var (n, px, py) = ((int)c[0], c[1], c[2]); var map = NArr(n); var ans = Dots(n, px, py, map); WriteLine(string.Join("\n", ans.Select(ai => $"{ai.X} {ai.Y}"))); } static Data[] Dots(int n, long px, long py, long[][] map) { var seg = new AtCoder.LazySegtree(n); for (var i = 0; i < n; ++i) { seg[i] = new Data(px, py); if (map[i][0] == 1) seg.Apply(0, n, new Func(0, map[i][1], 0)); else if (map[i][0] == 2) seg.Apply(0, n, new Func(0, 0, map[i][1])); else seg.Apply(0, n, new Func(1, 0, 0)); } var ans = new Data[n]; for (var i = 0; i < n; ++i) { ans[i] = seg[i]; } return ans; } struct Data { public long X; public long Y; public Data(long x, long y) { X = x; Y = y; } } struct Func { public int Rotate; public long X; public long Y; public Func (int r, long x, long y) { Rotate = r; X = x; Y = y; } } struct SegOp : AtCoder.ILazySegtreeOperator { public Data Identity => new Data(0, 0); public Func FIdentity => new Func(0, 0, 0); public Func Composition(Func nf, Func cf) { var cx = cf.X; var cy = cf.Y; var nr = nf.Rotate % 4; while (nr > 0) { (cx, cy) = (cy, -cx); --nr; } return new Func(cf.Rotate + nf.Rotate, cx + nf.X, cy + nf.Y); } public Data Mapping(Func f, Data x) { var cx = x.X; var cy = x.Y; var nr = f.Rotate % 4; while (nr > 0) { (cx, cy) = (cy, -cx); --nr; } return new Data(cx + f.X, cy + f.Y); } public Data Operate(Data x, Data y) { return x; } } }