1+ /* *
2+ * @file 115023L.cpp
3+ * @author Macesuted (i@macesuted.moe)
4+ * @date 2025-07-30
5+ *
6+ * @copyright Copyright (c) 2025
7+ *
8+ */
9+
10+ #include < bits/stdc++.h>
11+ using namespace std ;
12+
13+ #ifndef LOCAL
14+ #define endl ' \n '
15+ #endif
16+
17+ bool mem1;
18+
19+ #define maxn 200005
20+
21+ using tlll = tuple<int64_t , int64_t , int64_t >;
22+
23+ int64_t pow2 (int x) { return x < 30 ? (1 << x) : 1e9 ; }
24+
25+ tlll operator +(const tlll& a, const tlll& b) {
26+ auto [val, rest, len] = a;
27+ tlll ans = b;
28+
29+ if (val >= get<1 >(ans)) {
30+ get<0 >(ans)++, val -= get<1 >(ans), get<1 >(ans) = pow2 (get<2 >(ans));
31+ get<0 >(ans) += val / get<1 >(ans), val %= get<1 >(ans);
32+ }
33+ get<1 >(ans) -= val;
34+ get<1 >(ans) = min (rest + (get<1 >(ans) - 1 ) * pow2 (len), int64_t (1e9 ));
35+ get<2 >(ans) += len;
36+
37+ return ans;
38+ }
39+
40+ class SegmentTree {
41+ private:
42+ tlll a[maxn << 2 ];
43+ int n;
44+
45+ void build (int p, int l, int r, int v[]) {
46+ if (l == r) return a[p] = {v[l] / 2 + v[l] % 2 , v[l] % 2 + 1 , 1 }, void ();
47+ int mid = (l + r) >> 1 ;
48+ build (p << 1 , l, mid, v), build (p << 1 | 1 , mid + 1 , r, v);
49+ return a[p] = a[p << 1 ] + a[p << 1 | 1 ], void ();
50+ }
51+ tlll query (int p, int l, int r, int ql, int qr) {
52+ if (ql <= l && r <= qr) return a[p];
53+ int mid = (l + r) >> 1 ;
54+ if (qr <= mid) return query (p << 1 , l, mid, ql, qr);
55+ if (ql > mid) return query (p << 1 | 1 , mid + 1 , r, ql, qr);
56+ return query (p << 1 , l, mid, ql, qr) + query (p << 1 | 1 , mid + 1 , r, ql, qr);
57+ }
58+
59+ public:
60+ void resize (int _n) { return n = _n, void (); }
61+ void build (int v[]) { return build (1 , 1 , n, v); }
62+ tlll query (int l, int r) { return query (1 , 1 , n, l, r); }
63+ } SGT;
64+
65+ int a[maxn];
66+
67+ void solve (void ) {
68+ int n, q;
69+ cin >> n >> q;
70+ for (int i = 1 ; i <= n; i++) cin >> a[i];
71+ SGT.resize (n), SGT.build (a);
72+
73+ while (q--) {
74+ int x, y;
75+ cin >> x >> y, y = n - y + 1 ;
76+
77+ int p = upper_bound (a + 1 , a + n + 1 , x) - a;
78+
79+ if (y < p) {
80+ cout << 0 << endl;
81+ continue ;
82+ }
83+
84+ tlll ret = SGT.query (p, y);
85+ ret = tlll{x, 1 , 0 } + ret;
86+ cout << get<0 >(ret) - x << endl;
87+ }
88+ return ;
89+ }
90+
91+ bool mem2;
92+
93+ int main () {
94+ ios::sync_with_stdio (false ), cin.tie (nullptr );
95+ #ifdef LOCAL
96+ cerr << " Memory Cost: " << abs (&mem1 - &mem2) / 1024 . / 1024 . << " MB" << endl;
97+ #endif
98+
99+ int _ = 1 ;
100+ while (_--) solve ();
101+
102+ #ifdef LOCAL
103+ cerr << " Time Cost: " << clock () * 1000 . / CLOCKS_PER_SEC << " MS" << endl;
104+ #endif
105+ return 0 ;
106+ }
0 commit comments