Advertisement
Guest User

Untitled

a guest
Jun 21st, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.70 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace stda;
  5.  
  6. struct branch
  7. {
  8. vector<pair<int, int>> v;
  9. long long s;
  10. };
  11.  
  12. int getFarthest(int n, const vector<int>& v, const vector<branch>& b, long long& distance)
  13. {
  14. long long latest = -1, cur = n, cd = 0, maxi = -1;
  15. distance = 0;
  16. for (int i = 0; i < n - 1; ++i)
  17. {
  18. cur = (n + i) % v.size();
  19. if (b[cur].s > v[cur])
  20. {
  21. if (cd + b[cur].s > distance)
  22. {
  23. distance = cd + b[cur].s;
  24. latest = b[cur].v.back().second;
  25. maxi = cur;
  26. }
  27. else if (cd + b[cur].s == distance)
  28. {
  29. if (b[cur].v.back().second > latest)
  30. {
  31. distance = cd + b[cur].s;
  32. latest = b[cur].v.back().second;
  33. maxi = cur;
  34. }
  35. }
  36. }
  37. else
  38. {
  39. if (cd + v[cur] > distance)
  40. {
  41. distance = cd + v[cur];
  42. maxi = cur;
  43. }
  44. }
  45. cd += v[cur];
  46. }
  47. if (b[cur].s > 0)
  48. {
  49. if (cd + b[cur].s > distance)
  50. {
  51. distance = cd + b[cur].s;
  52. latest = b[cur].v.back().second;
  53. maxi = cur;
  54. }
  55. else if (cd + b[cur].s == distance)
  56. {
  57. if (b[cur].v.back().second > latest)
  58. {
  59. distance = cd + b[cur].s;
  60. latest = b[cur].v.back().second;
  61. maxi = cur;
  62. }
  63. }
  64. }
  65. cout<<"far "<<n<<" "<<maxi<<" dist="<<distance<<"\n";
  66. return maxi;
  67. }
  68.  
  69.  
  70. int main()
  71. {
  72. int n, m, x, y, w, t, far;
  73. long long dist;
  74. cin>>n;
  75. vector<int> v(n);
  76.  
  77. for (int i = 0; i < n; i++) {
  78. cin>>v[i];
  79. }
  80.  
  81. vector<branch> b(n);
  82.  
  83. cin >> m;
  84. for (int q = 0; q < m; ++q)
  85. {
  86. cin>>t;
  87. if (t == 1)
  88. {
  89. cin>>x>>w;
  90. --x;
  91. far = getFarthest(x, v, b, dist);
  92. b[far].v.push_back(make_pair(w, q));
  93. b[far].s += w;
  94. }
  95. else if (t == 2)
  96. {
  97. cin>>x>>w;
  98. --x;
  99. b[x].v.push_back(make_pair(w, q));
  100. b[x].s += w;
  101. }
  102. else if (t == 3)
  103. {
  104. cin>>x;
  105. --x;
  106. far = getFarthest(x, v, b, dist);
  107. b[far].s -= b[far].v.back().first;
  108. b[far].v.pop_back();
  109. }
  110. else
  111. {
  112. cin>>x;
  113. --x;
  114. far = getFarthest(x, v, b, dist);
  115. cout<<dist<<'\n';
  116. }
  117. }
  118.  
  119. return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement