Advertisement
wowonline

Untitled

Mar 26th, 2022
1,034
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <utility>
  3. #include <map>
  4. #include <unordered_map>
  5.  
  6. #define ull unsigned long long
  7. #define ll long long
  8. #define MOD 4294967161
  9.  
  10. int main()
  11. {
  12.     std::unordered_map<ull, std::unordered_map<ull, ull>> m2;
  13.     std::map<std::pair<ull, ull>, ull> m1, m3;
  14.  
  15.     ull i, j, val;
  16.     while (std::cin >> i >> j >> val && !std::cin.eof()) {
  17.         if (i == 0 && j == 0 && val == 4294967161) {
  18.             break;
  19.         }
  20.         val %= MOD;
  21.         std::pair<ull, ull> p(i, j);
  22.         m1.insert(std::pair<std::pair<ull, ull>, ull>(p, val));
  23.     }
  24.  
  25.     while (std::cin >> i >> j >> val && !std::cin.eof()) {
  26.         val %= MOD;
  27.         m2.insert(std::pair<ull, std::unordered_map<ull, ull> >(i, std::unordered_map<ull, ull>()));
  28.         m2[i][j] = val;
  29.  
  30.     }
  31.  
  32.     ull k, val1, val2;
  33.     std::unordered_map<ull, std::unordered_map<ull, ull>>::iterator it2;
  34.     for (std::map<std::pair<ull, ull>, ull>::iterator it1 = m1.begin(); it1 != m1.end(); ++it1) {
  35.         if ((it2 = m2.find((*it1).first.second)) != m2.end()) {
  36.             std::unordered_map<ull, ull>& i_m = it2->second;
  37.             i = (*it1).first.first;
  38.             j = (*it1).first.second;
  39.             val1 = (*it1).second;
  40.             for (auto c : i_m) {
  41.                 k = c.first;
  42.                 val2 = c.second;
  43.                 std::pair<ull, ull> p2 = {i, k};
  44.                 if (m3.count(p2)) {
  45.                     m3[p2] += ((val1 % MOD) * (val2 % MOD)) % MOD;
  46.                 } else {
  47.                     m3[p2] = ((val1 % MOD) * (val2 % MOD)) % MOD;
  48.                 }
  49.             }
  50.         }
  51.     }
  52.  
  53.     // m1 <pair<i, j>, value>
  54.     // m2 <j, unorderd_map<k, value> >
  55.     // m3 <pair<i, k>, sum>
  56.  
  57.     for (std::map<std::pair<ull, ull>, ull>::iterator it3 = m3.begin(); it3 != m3.end(); ++it3) {
  58.         if ((*it3).second != 0) {
  59.             std::cout << (*it3).first.first << " " << (*it3).first.second << " " << (*it3).second << std::endl;
  60.         }
  61.     }
  62.  
  63.     return 0;
  64. }
Advertisement
RAW Paste Data Copied
Advertisement