RT,赛时想出来了二分做法,一直T三个点,whatshouldido
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
map<int, int> v1;
int idx;
vector<int> f[N], g[N];
inline int get_pre(vector<int> a, int x)
{
if (x < a[0]) return -1;
int l = 0, r = a.size() - 1;
while (l < r)
{
int mid = (l + r + 1) >> 1;
if (a[mid] > x) r = mid - 1;
else l = mid;
}
return a[l] + 1;
}
inline int get_nxt(vector<int> a, int x)
{
if (x > a[a.size() - 1]) return -1;
int l = 0, r = a.size() - 1;
while (l < r)
{
int mid = (l + r) >> 1;
if (a[mid] < x) l = mid + 1;
else r = mid;
}
return a[l] - 1;
}
inline int read()
{
int x = 0, y = 1; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') y = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * y;
}
int main()
{
int n, m, s, t;
n = read(), m = read(), s = read(), t = read();
int k;
k = read();
for (int i = 1; i <= k; i++)
{
int x, y;
x = read(), y = read();
if (!v1[x]) v1[x] = ++idx;
if (!v1[y]) v1[y] = ++idx;
f[v1[x]].push_back(y);
g[v1[y]].push_back(x);
}
for (int i = 1; i <= idx; i++)
sort(f[i].begin(), f[i].end()), sort(g[i].begin(), g[i].end());
int q;
q = read();
while (q--)
{
char op;
int l;
cin >> op;
l = read();
if (op == 'L')
{
int y = v1[s];
if (!f[y].size()) t = max(1, t - l);
else
{
int x = get_pre(f[y], t);
if (x == -1) t = max(1, t - l);
else t = max(x, t - l);
}
}
else if (op == 'U')
{
int y = v1[t];
if (!g[y].size()) s = max(1, s - l);
else
{
int x = get_pre(g[y], s);
if (x == -1) s = max(1, s - l);
else s = max(x, s - l);
}
}
else if (op == 'R')
{
int y = v1[s];
if (!f[y].size()) t = min(m, t + l);
else
{
int x = get_nxt(f[y], t);
if (x == -1) t = min(m, t + l);
else t = min(x, t + l);
}
}
else
{
int y = v1[t];
if (!g[y].size()) s = min(n, s + l);
else
{
int x = get_nxt(g[y], s);
if (x == -1) s = min(n, s + l);
else s = min(x, s + l);
}
}
printf("%d %d\n", s, t);
}
return 0;
}