Advertisement
matheus_monteiro

On The Way To Shopping

Dec 26th, 2021
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.87 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5. #define ii pair<int, int>
  6. #define fi first
  7. #define se second
  8. #define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  9.  
  10. const int MAX = 800100;
  11. const int LOG_MAX = 20;
  12.  
  13. int n; // the queries will be performed in the range [0, n - 1]
  14. int L[LOG_MAX * MAX]; // L[node] is the left child of node
  15. int R[LOG_MAX * MAX]; // R[node] is the right child of node
  16. int tree[LOG_MAX * MAX]; // tree[node] is the value stored in the node
  17. int root[MAX]; // stores the root of each version
  18. int next_vertex; // next index for a vertex
  19. int version_count; // number of different versions of the tree
  20.  
  21. void calc(int node) {
  22.     int sum = 0;
  23.     if(L[node]) sum += tree[L[node]];
  24.     if(R[node]) sum += tree[R[node]];
  25.     tree[node] = sum;
  26. }
  27. void update(int prev, int node, int start, int end, int idx, int value) {
  28.     if(start == end)
  29.         tree[node] = tree[prev] + value;
  30.     else {
  31.         int mid = (start + end) / 2;
  32.         if(start <= idx and idx <= mid) {
  33.         R[node] = R[prev];
  34.         if(L[node] == 0) L[node] = next_vertex++;
  35.         update(L[prev], L[node], start, mid, idx, value);
  36.         } else {
  37.         L[node] = L[prev];
  38.         if(R[node] == 0) R[node] = next_vertex++;
  39.         update(R[prev], R[node], mid + 1, end, idx, value);
  40.         }
  41.         calc(node);
  42.     }
  43. }
  44. int query(int node, int start, int end, int l, int r) {
  45.     if(l > end or r < start) return 0;
  46.     if(l <= start and end <= r) return tree[node];
  47.     int mid = (start + end) / 2, q1 = 0, q2 = 0;
  48.     if(L[node]) q1 = query(L[node], start, mid, l, r);
  49.     if(R[node]) q2 = query(R[node], mid + 1, end, l, r);
  50.     return q1 + q2;
  51. }
  52.  
  53. void init() {
  54.     root[0] = 0;
  55.     next_vertex = 1;
  56.     version_count = 1;
  57. }
  58. int update(int idx, int value, int prev_version = -1) {
  59.     if(prev_version == -1) prev_version = version_count - 1;
  60.     root[version_count] = next_vertex++;
  61.     update(root[prev_version], root[version_count], 0, n - 1, idx, value);
  62.     version_count++;
  63.     return version_count - 1;
  64. }
  65. int query(int l, int r, int version = -1) {
  66.     if(l == -1 or r == -1) return 0;
  67.     if(version == -1) version = version_count - 1;
  68.     return query(root[version], 0, n - 1, l, r);
  69. }
  70.  
  71. int query_budget(int node_l, int node_r, int start, int end, int budget) {
  72.     if(tree[node_r] - tree[node_l] <= budget)
  73.         return tree[node_r] - tree[node_l];
  74.    
  75.     if(start == end)  return 0;
  76.  
  77.     int s = 0;
  78.     if(L[node_r]) s = tree[L[node_r]] - tree[L[node_l]];
  79.  
  80.     int mid = (start + end) / 2;
  81.  
  82.     if(s <= budget) {
  83.         if(R[node_r])
  84.            s += query_budget(R[node_l], R[node_r], mid + 1, end, budget - s);
  85.     } else {
  86.         s = 0;
  87.         if(L[node_r])
  88.             s = query_budget(L[node_l], L[node_r], start, mid, budget);
  89.     }
  90.     return s;
  91. }
  92.  
  93. void solve(){
  94.     int q, sum = 0;
  95.     cin >> n >> q;
  96.  
  97.     map<int, bool> cor;
  98.     map<int, int> mapping;
  99.  
  100.     vector<int> price(n);
  101.     for(int &w : price) cin >> w, sum += w, cor[w] = true;
  102.  
  103.     int id = 0;
  104.     for(auto it : cor)
  105.         mapping[it.fi] = id++;
  106.    
  107.     auto get_pos = [&](int x) {
  108.         auto it = mapping.upper_bound(x);
  109.         if(it == mapping.begin()) return -1ll;
  110.         it--;
  111.         return it->se;
  112.     };
  113.  
  114.     vector<int> version = {0};
  115.  
  116.     init();
  117.  
  118.     for(int i = 0; i < n; ++i)
  119.         version.push_back(update(get_pos(price[i]), price[i], version.back()));
  120.  
  121.     int ans = 0;
  122.  
  123.     for(int i = 1; i <= q; ++i) {
  124.         int x, y, z;
  125.         cin >> x >> y >> z;
  126.  
  127.         int l = 1 + (((x + ans - 1) % n) + n) % n;
  128.         int r = 1 + (((y + ans - 1) % n) + n) % n;
  129.         int budget = z + ans;
  130.  
  131.         ans = query_budget(root[version[l - 1]], root[version[r]], 0, n - 1, budget);
  132.         cout << ans << '\n';
  133.     }
  134.    
  135. }
  136.  
  137. int32_t main() {
  138.     fastio;
  139.     solve();
  140.     return 0;
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement