fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. struct Comparer {
  5. bool operator() (const pair<bitset<64>,bitset<64>> &b1, const pair<bitset<64>,bitset<64>> &b2) const {
  6. if(b1.first.to_ullong()==b2.first.to_ullong())return b1.second.to_ullong() < b2.second.to_ullong();
  7. return b1.first.to_ullong()<b2.first.to_ullong();
  8. }
  9. };
  10. int main()
  11. {
  12. ios_base::sync_with_stdio(0);
  13.  
  14. int q;
  15. cin >> q;
  16. map<pair<bitset<64>,bitset<64>>, long long,Comparer > cost;
  17. for (int i=0; i<q; i++)
  18. {
  19. int a;
  20. cin >> a;
  21. if (a==1)
  22. {
  23. long long v, u ,w;
  24. cin >> v >> u >> w;
  25. bitset<64> x(u);
  26. bitset<64> y(v);
  27. int dist;
  28. for (int i=0; i<64; i++)
  29. {
  30. if (x[i] != y[i])
  31. {
  32. dist=i;
  33. break;
  34. }
  35. }
  36. for (int i=0; i<dist; i++)
  37. {
  38. cost[{x,x>>1}]+=w;
  39. x>>=1;
  40. cost[{y>>1,y}]+=w;
  41. y>>=1;
  42. }
  43. }
  44. if (a==2)
  45. {
  46. long long v, u;
  47. cin >> v >> u;
  48. bitset<64> x(v);
  49. bitset<64> y(u);
  50. long long price=0;
  51. int dist;
  52. for (int i=0; i<64; i++)
  53. {
  54. if (x[i] != y[i])
  55. {
  56. dist=i;
  57. break;
  58. }
  59. }
  60. for (int i=0; i<dist; i++)
  61. {
  62. price+=cost[{x,x>>1}];
  63. x>>=1;
  64. price+=cost[{y>>1, y}];
  65. y>>=1;
  66. }
  67. cout << price <<endl;
  68. }
  69. }
  70.  
  71. return 0;
  72. }
  73.  
Success #stdin #stdout 0s 3416KB
stdin
7
1 3 4 30
1 4 1 2
1 3 6 8
2 4 3
1 6 1 40
2 3 7
2 2 4
stdout
0
0
0