Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace stda;
- struct branch
- {
- vector<pair<int, int>> v;
- long long s;
- };
- int getFarthest(int n, const vector<int>& v, const vector<branch>& b, long long& distance)
- {
- long long latest = -1, cur = n, cd = 0, maxi = -1;
- distance = 0;
- for (int i = 0; i < n - 1; ++i)
- {
- cur = (n + i) % v.size();
- if (b[cur].s > v[cur])
- {
- if (cd + b[cur].s > distance)
- {
- distance = cd + b[cur].s;
- latest = b[cur].v.back().second;
- maxi = cur;
- }
- else if (cd + b[cur].s == distance)
- {
- if (b[cur].v.back().second > latest)
- {
- distance = cd + b[cur].s;
- latest = b[cur].v.back().second;
- maxi = cur;
- }
- }
- }
- else
- {
- if (cd + v[cur] > distance)
- {
- distance = cd + v[cur];
- maxi = cur;
- }
- }
- cd += v[cur];
- }
- if (b[cur].s > 0)
- {
- if (cd + b[cur].s > distance)
- {
- distance = cd + b[cur].s;
- latest = b[cur].v.back().second;
- maxi = cur;
- }
- else if (cd + b[cur].s == distance)
- {
- if (b[cur].v.back().second > latest)
- {
- distance = cd + b[cur].s;
- latest = b[cur].v.back().second;
- maxi = cur;
- }
- }
- }
- cout<<"far "<<n<<" "<<maxi<<" dist="<<distance<<"\n";
- return maxi;
- }
- int main()
- {
- int n, m, x, y, w, t, far;
- long long dist;
- cin>>n;
- vector<int> v(n);
- for (int i = 0; i < n; i++) {
- cin>>v[i];
- }
- vector<branch> b(n);
- cin >> m;
- for (int q = 0; q < m; ++q)
- {
- cin>>t;
- if (t == 1)
- {
- cin>>x>>w;
- --x;
- far = getFarthest(x, v, b, dist);
- b[far].v.push_back(make_pair(w, q));
- b[far].s += w;
- }
- else if (t == 2)
- {
- cin>>x>>w;
- --x;
- b[x].v.push_back(make_pair(w, q));
- b[x].s += w;
- }
- else if (t == 3)
- {
- cin>>x;
- --x;
- far = getFarthest(x, v, b, dist);
- b[far].s -= b[far].v.back().first;
- b[far].v.pop_back();
- }
- else
- {
- cin>>x;
- --x;
- far = getFarthest(x, v, b, dist);
- cout<<dist<<'\n';
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement