Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <cmath>
- #include <iostream>
- #include <map>
- #include <string>
- #include <vector>
- #include <set>
- #include <unordered_map>
- using namespace std;
- int find_distance(const set<int>& reachable_stations, int finish) {
- if (reachable_stations.size() == 1) {
- return abs(finish - *reachable_stations.begin());
- }
- auto it = lower_bound(reachable_stations.begin(), reachable_stations.end(), finish);
- if (it == reachable_stations.end()) {
- return abs(finish - *(--it));
- }
- if (it == reachable_stations.begin()) {
- return abs(finish - *it);
- }
- return min(abs(finish - *it), abs(finish - *(it--)));
- }
- class RouteManager {
- public:
- void AddRoute(int start, int finish) {
- reachable_lists_[start].insert(finish);
- reachable_lists_[finish].insert(start);
- }
- int FindNearestFinish(int start, int finish) const {
- int result = abs(start - finish);
- auto it = reachable_lists_.find(start);
- if (it == reachable_lists_.end()) {
- return result;
- }
- const set<int>& reachable_stations = it->second;
- if (!reachable_stations.empty()) {
- result = min( result, find_distance(reachable_stations, finish));
- }
- return result;
- }
- private:
- unordered_map<int, set<int>> reachable_lists_;
- };
- int main() {
- RouteManager routes;
- int query_count;
- cin >> query_count;
- for (int query_id = 0; query_id < query_count; ++query_id) {
- string query_type;
- cin >> query_type;
- int start, finish;
- cin >> start >> finish;
- if (query_type == "ADD"s) {
- routes.AddRoute(start, finish);
- } else if (query_type == "GO"s) {
- cout << routes.FindNearestFinish(start, finish) << "\n"s;
- }
- }
- }
Advertisement