#include <bits/stdc++.h>
#include <string>
#include <unordered_set>
#include <utility>
using namespace std;
using ll = long long;
deque<pair<int, int>> snake;
unordered_set<string> paths;
int dx[] = {0, 0, 0, -1, 1}; // 占位 上 下 左 右
int dy[] = {0, 1, -1, 0, 0};
bool moveSnake(int dir) {
// TODO: 请实现移动逻辑
auto head = snake.back();
int x = head.first + dx[dir];
int y = head.second + dy[dir];
// 检查是否撞到自己
string s = to_string(x) + ',' + to_string(y);
if (paths.count(s)) {
return true;
}
// 移动蛇身
auto tail = snake.front();
snake.pop_front();
snake.emplace_back(x, y);
// 更新路径
paths.erase(to_string(tail.first) + ',' + to_string(tail.second));
paths.insert(s);
return false;
}
bool eatSnake(int dir) {
// TODO: 请实现吃果子生长逻辑
auto head = snake.back();
int x = head.first + dx[dir];
int y = head.second + dy[dir];
// 检查是否撞到自己
string s = to_string(x) + ',' + to_string(y);
if (paths.count(s)) {
return true;
}
// 移动蛇身
snake.emplace_back(x, y);
// 更新路径
paths.insert(s);
return false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
snake.clear();
paths.clear();
for (int i = 0; i < n; i++) {
int x, y;
cin >> x >> y;
snake.emplace_back(x, y);
paths.insert(to_string(x) + ',' + to_string(y));
}
for (int i = 0; i < q; i++) {
int op, dir;
cin >> op >> dir;
bool collision = (op == 1 ? moveSnake(dir) : eatSnake(dir));
if (collision) {
cout << -1 << '\n';
return 0;
} else {
for (auto it = snake.rbegin(); it != snake.rend(); ++it) {
cout << it->first << ' ' << it->second << '\n';
}
}
}
return 0;
}