Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Pratiyush Mishra
- #include <bits/stdc++.h>
- #define ull unsigned long long int
- #define ll long long int
- #define LL_MAX 9223372036854775807
- #define pb push_back
- #define pf push_front
- #define mp make_pair
- #define popb pop_back
- #define vl vector<ll>
- #define pl pair<ll,ll>
- #define bs(v, x) binary_search(v.begin(), v.end(), x)
- #define mem1(a) memset(a, -1, sizeof(a))
- #define popf pop_front
- #define p0(x) cout << x << " "
- #define p1(x) cout << x << '\n'
- #define p2(x, y) cout << x << " " << y << '\n'
- #define p3(x, y, z) cout << x << " " << y << " " << z << '\n'
- #define printv(v) \
- for (ll i = 0; i < v.size(); ++i) \
- cout << v[i] << " "; \
- cout << '\n'
- #define pr1(x) cout << fixed << setprecision(15) << x << '\n'
- #define ordered_set tree<pair<ll, ll>, null_type, less<pair<ll, ll>>, rb_tree_tag, tree_order_statistics_node_update>
- // ordered_set s ; s.order_of_key(val) no. of elements strictly less than val
- // s.find_by_order(i) itertor to ith element (0 indexed)
- #define mod 1000000007
- #define mod1 998244353
- #define fio \
- ios_base::sync_with_stdio(false); \
- cin.tie(NULL)
- #define get(n) \
- ll n; \
- cin >> n
- #define getvec(v, n) \
- vector<ll> v(n); \
- for (ll i = 0; i < n; i++) \
- cin >> v[i];
- #define getstr(s) \
- string s; \
- cin >> s
- #define all(x) x.begin(), x.end()
- #define countBits(x) __builtin_popcount(x)
- using namespace std;
- vector<int> x, y;
- map<int, vector<pair<int, string>>> dp_x, dp_y;
- map<string, int> inv_name;
- vector<string> name;
- int find(vector<pair<int, string>> &v, int x)
- {
- int l = 0;
- int h = v.size() - 1;
- int ans = -1;
- while (l <= h)
- {
- int mid = (l + h) / 2;
- int val = v[mid].first;
- if (val > x)
- h = mid - 1 ;
- else if (val < x)
- l = mid + 1;
- else
- return mid;
- }
- return ans;
- }
- pair<int, string> cal(int pos, vector<pair<int, string>> &v)
- {
- int dis = INT_MAX;
- string ans = "";
- for (int j = -1; j <= 1; j += 2)
- {
- int n_pos = pos + j;
- if (n_pos >= 0 && n_pos < v.size())
- {
- int diff = abs(v[pos].first - v[n_pos].first);
- if (diff <= dis)
- {
- dis = diff;
- if (ans == "")
- ans = v[n_pos].second;
- else if (ans > v[n_pos].second)
- ans = v[n_pos].second;
- }
- }
- }
- return {dis, ans};
- }
- void solve(string &s)
- {
- int X = x[inv_name[s]];
- int Y = y[inv_name[s]];
- int pos_x = find(dp_x[X], X);
- int pos_y = find(dp_y[Y], Y);
- string ans = "";
- pair<int, string> it1 = cal(pos_x, dp_x[X]);
- pair<int, string> it2 = cal(pos_y, dp_y[Y]);
- if (it1.first == INT_MAX && it2.first == INT_MAX)
- p1("None");
- else if (it1.first == INT_MAX)
- p1(it2.second);
- else if (it2.first == INT_MAX)
- p1(it1.second);
- else if (it1.first > it2.first)
- p1(it2.second);
- else if (it1.first < it2.first)
- p1(it1.second);
- else
- p1(min(it1.second, it2.second));
- }
- void mainSolve()
- {
- int n;
- cin >> n;
- x.clear();
- y.clear();
- name.clear();
- dp_x.clear();
- dp_y.clear();
- inv_name.clear();
- for (int i = 0; i < n; i++)
- {
- int X;
- cin >> X;
- x.push_back(X);
- }
- for (int i = 0; i < n; i++)
- {
- int Y;
- cin >> Y;
- y.push_back(Y);
- }
- for (int i = 0; i < n; ++i)
- {
- string s;
- cin >> s;
- name.push_back(s);
- inv_name[s] = i;
- }
- for (int i = 0; i < n; i++)
- {
- dp_x[x[i]].push_back({y[i], name[i]});
- dp_y[y[i]].push_back({x[i], name[i]});
- }
- for (auto &it : dp_x)
- {
- sort(it.second.begin(), it.second.end());
- }
- for (auto &it : dp_y)
- {
- sort(it.second.begin(), it.second.end());
- }
- int q;
- cin >> q;
- while (q--)
- {
- string s;
- cin >> s;
- solve(s);
- }
- }
- int main()
- {
- fio;
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- get(t);
- //ll t = 1;
- while (t--)
- {
- mainSolve();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement