Advertisement
pasholnahuy

ZPATRIOT

Sep 30th, 2023
944
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.49 KB | None | 0 0
  1. #include <iostream>
  2. #include <tuple>
  3. #include <random>
  4.  
  5. using namespace std;
  6. using int64 = int64_t;
  7.  
  8.  
  9. class SegmentTree {
  10. public:
  11.     int64 log_size;
  12.     vector<int64> nodes = std::vector<int64>((2 << log_size) - 1);
  13.  
  14.     static int64 IntLog(int64 n) {
  15.         int64 temp = 1;
  16.         int64 ans = 0;
  17.         while (temp < n) {
  18.             temp *= 2;
  19.             ++ans;
  20.         }
  21.         return ans;
  22.     }
  23.  
  24.     static int64 Pow2(int64 n) {
  25.         return 1 << n;
  26.     }
  27.  
  28.     explicit SegmentTree(const vector<int64> &vec) : log_size(IntLog(vec.size())) {
  29.         std::copy(vec.begin(), vec.end(), nodes.begin() + (1 << log_size) - 1);
  30.         for (int64 i = Pow2(log_size) - 2; i >= 0; --i) {
  31.             nodes[i] = nodes[2 * i + 1] + nodes[2 * i + 2];
  32.         }
  33.     }
  34.  
  35.     void Modify(int64 ind, int64 value) {
  36.         int64 temp = Pow2(log_size) + ind - 1;
  37.         nodes[temp] = value;
  38.         while (temp != 0) {
  39.             temp = (temp - 1) / 2;
  40.             nodes[temp] = nodes[temp * 2 + 1] + nodes[temp * 2 + 2];
  41.         }
  42.     }
  43.  
  44.     int64 GetSum(int64 l, int64 r) {
  45.         return GetSum(l, r, 0, 0, Pow2(log_size) - 1);
  46.     }
  47.     int64 BinSec(int64 n, int64 ll, int64 s){
  48.         int64 r = n;
  49.         int64 l = ll;
  50.         s -= GetSum(0, ll);
  51.         if (GetSum(l, r - 1) < s){
  52.             return 0;
  53.         }
  54.         while (l + 1 < r) {
  55.             int64 mid = (l + r) / 2;
  56.             int64 t = GetSum(l, mid);
  57.             if (t <= s){
  58.                 l = mid + 1;
  59.             } else {
  60.                 r = mid;
  61.             }
  62.         }
  63.         return l;
  64.     }
  65. private:
  66.     int64 GetSum(int64 l, int64 r, int64 n, int64 nl, int64 nr) {
  67.         if (l > r) {
  68.             return 0;
  69.         }
  70.         if (l == nl && r == nr) {
  71.             return nodes[n];
  72.         }
  73.         int64 mid = (nl + nr) / 2;
  74.         return GetSum(l, min(r, mid), n * 2 + 1, nl, mid) +
  75.                GetSum(max(l, mid + 1), r, n * 2 + 2, mid + 1, nr);
  76.     }
  77.  
  78. };
  79.  
  80. int main() {
  81.     ios::sync_with_stdio(false);
  82.     cin.tie(nullptr);
  83.  
  84.     int n, m;
  85.     cin >> n >> m;
  86.     vector<int64> vec(n);
  87.     for (int i = 0; i < n; ++i){
  88.         cin >> vec[i];
  89.     }
  90.     SegmentTree arr(vec);
  91.     int t;
  92.     cin >> t;
  93.     int64 p = 0;
  94.     for (int i = 0; i < t; ++i){
  95.         int x, y;
  96.         cin >> x >> y;
  97.         int64 l = (x + p) % n ;
  98.         int64 k = (y + p) % n ;
  99.         int64 ans = arr.BinSec(n, l, k);
  100.         p = ans + 1;
  101.         cout << ans << '\n';
  102.     }
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement