Advertisement
cosenza987

Untitled

Jan 31st, 2023
884
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.09 KB | None | 0 0
  1. //Слава Україні, Героям слава
  2.  
  3. #include <bits/stdc++.h>
  4.  
  5. using namespace std;
  6.  
  7. using vll = __int128_t;
  8.  
  9. const int N = 5e4 + 7, Q = 1e5 + 7;
  10.  
  11. map<pair<vll, vll>, vll> mp;
  12.  
  13. struct line {
  14.     vll b, m;
  15.     long long ind;
  16. };
  17.  
  18. int nh, pos;
  19. line hull[N + Q];
  20.  
  21. bool check(line s, line t, line u) {
  22.     return (s.b - t.b) * (u.m - s.m) < (s.b - u.b) * (t.m - s.m);
  23. }
  24.  
  25. void update(line s) {
  26.     while(nh >= 2 and !check(hull[nh - 2], hull[nh - 1], s)) {
  27.         nh--;
  28.     }
  29.     if(nh >= 1 and hull[nh - 1].b <= s.b) {
  30.         nh--;
  31.     }
  32.     while(nh >= 1 and hull[nh - 1].m == s.m and hull[nh - 1].b == s.b and hull[nh - 1].ind < s.ind) {
  33.         nh--;
  34.     }
  35.     hull[nh++] = s;
  36. }
  37.  
  38. vll eval(int id, vll x) {
  39.     return hull[id].b + hull[id].m * x;
  40. }
  41.  
  42. pair<long long, vll> find(vll x) {
  43.     while(pos + 1 < nh and eval(pos, x) < eval(pos + 1, x)) {
  44.         pos++;
  45.     }
  46.     long long ans = hull[pos].ind;
  47.     return {ans, -eval(pos, x)};
  48. }
  49.  
  50. int main() {
  51.     ios_base::sync_with_stdio(false);
  52.     cin.tie(nullptr);
  53.     int n, query;
  54.     cin >> n >> query;
  55.     vector<line> u;
  56.     vector<long long> v(n + 1);
  57.     vector<vector<long long>> q(query, vector<long long>(3)), modif(n + 1, vector<long long>(3, -1));
  58.     //in modif -> 0 = speed, 1 = time, 2 = lpos
  59.     //in query -> 0 = participant, 1 = time, 2 = delta velocity
  60.     for(int i = 1; i <= n; i++) {
  61.         cin >> v[i];
  62.         u.push_back({0, -v[i], i});
  63.     }
  64.     for(int i = 0; i < query; i++) {
  65.         cin >> q[i][0] >> q[i][1] >> q[i][2];
  66.         if(modif[q[i][0]][0] == -1) {
  67.             vll cur = 1;
  68.             cur *= v[q[i][0]] * q[i][1];
  69.             vll vel = v[q[i][0]] - q[i][2];
  70.             u.push_back({-cur + vel * q[i][1], -vel, q[i][0]});
  71.             //cout << "inserting " << (long long)(-cur) + (long long)vel * q[i][1] << " " << (long long)(-vel) << " " << q[i][0] << "\n";
  72.             modif[q[i][0]][0] = vel;
  73.             modif[q[i][0]][1] = q[i][1];
  74.             modif[q[i][0]][2] = cur;
  75.         } else {
  76.             vll vel = modif[q[i][0]][0] - q[i][2];
  77.             vll cur = modif[q[i][0]][2];
  78.             cur += modif[q[i][0]][0] * (q[i][1] - modif[q[i][0]][1]);
  79.             //cout << "inserting " << (long long)(-cur) + (long long)vel * q[i][1] << " " << (long long)(-vel) << " " << q[i][0] << "\n";
  80.             u.push_back({ -cur + vel * q[i][1], -vel, q[i][0] });
  81.             modif[q[i][0]][0] = vel;
  82.             modif[q[i][0]][1] = q[i][1];
  83.             modif[q[i][0]][2] = cur;
  84.         }
  85.     }
  86.     sort(u.begin(), u.end(), [](line s, line t) {
  87.         return (s.m == t.m) ? (s.b < t.b) : (s.m < t.m);
  88.     });
  89.     for(auto e : u) {
  90.         //cout << (long long)(-e.m) << " " << (long long)(-e.b) << " " << e.ind << "\n";
  91.         update(e);
  92.     }
  93.     for(int i = 2; i < nh; i++) {
  94.         assert(hull[i].m != hull[i - 1].m);
  95.         vll r = (hull[i].b - hull[i - 1].b) * (hull[i - 2].m - hull[i - 1].m);
  96.         vll l = (hull[i - 2].b - hull[i - 1].b) * (hull[i].m - hull[i - 1].m);
  97.         assert(l < r);
  98.     }
  99.     for(int i = 1; i < u.size(); i++) {
  100.         // mx + b = zx + c
  101.         // x = (c - b) / (m - z)
  102.         if((u[i].m - u[i - 1].m) != 0 and (u[i].b - u[i - 1].b) % (u[i].m - u[i - 1].m) == 0) {
  103.             //cout << "intersection between " << i - 1 << " and " << i << "\n";
  104.             vll x = (u[i].b - u[i - 1].b) / (u[i].m - u[i - 1].m);
  105.             vll y = u[i].b + u[i].m * x;
  106.             //cout << "the values are " << (long long)x << " " << (long long)y << "\n";
  107.             mp[{-x, -y}] = max({mp[{-x, -y}], (vll)u[i].ind, (vll)u[i - 1].ind});
  108.         }
  109.     }
  110.     //for(int i = 0; i < nh; i++) {
  111.         //cout << (long long)(-hull[i].m) << " " << (long long)(-hull[i].b) << " " << hull[i].ind << "\n";
  112.     //}
  113.     for(int i = 0; i < query; i++) {
  114.         auto ans = find(q[i][1]);
  115.         ans.first = max(ans.first, (long long)mp[{q[i][1], ans.second}]);
  116.         //cout << q[i][1] << " " << ans.second << " " << mp[{q[i][1], ans.second}] << "\n";
  117.         cout << ans.first << " " << (unsigned long long)ans.second << "\n";
  118.     }
  119.     return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement