Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <utility>
- #include <map>
- #include <unordered_map>
- #define ull unsigned long long
- #define ll long long
- #define MOD 4294967161
- int main()
- {
- std::unordered_map<ull, std::unordered_map<ull, ull>> m2;
- std::map<std::pair<ull, ull>, ull> m1, m3;
- ull i, j, val;
- while (std::cin >> i >> j >> val && !std::cin.eof()) {
- if (i == 0 && j == 0 && val == 4294967161) {
- break;
- }
- val %= MOD;
- std::pair<ull, ull> p(i, j);
- m1.insert(std::pair<std::pair<ull, ull>, ull>(p, val));
- }
- while (std::cin >> i >> j >> val && !std::cin.eof()) {
- val %= MOD;
- m2.insert(std::pair<ull, std::unordered_map<ull, ull> >(i, std::unordered_map<ull, ull>()));
- m2[i][j] = val;
- }
- ull k, val1, val2;
- std::unordered_map<ull, std::unordered_map<ull, ull>>::iterator it2;
- for (std::map<std::pair<ull, ull>, ull>::iterator it1 = m1.begin(); it1 != m1.end(); ++it1) {
- if ((it2 = m2.find((*it1).first.second)) != m2.end()) {
- std::unordered_map<ull, ull>& i_m = it2->second;
- i = (*it1).first.first;
- j = (*it1).first.second;
- val1 = (*it1).second;
- for (auto c : i_m) {
- k = c.first;
- val2 = c.second;
- std::pair<ull, ull> p2 = {i, k};
- if (m3.count(p2)) {
- m3[p2] += ((val1 % MOD) * (val2 % MOD)) % MOD;
- } else {
- m3[p2] = ((val1 % MOD) * (val2 % MOD)) % MOD;
- }
- }
- }
- }
- // m1 <pair<i, j>, value>
- // m2 <j, unorderd_map<k, value> >
- // m3 <pair<i, k>, sum>
- for (std::map<std::pair<ull, ull>, ull>::iterator it3 = m3.begin(); it3 != m3.end(); ++it3) {
- if ((*it3).second != 0) {
- std::cout << (*it3).first.first << " " << (*it3).first.second << " " << (*it3).second << std::endl;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement