#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ra read()
#define ls p << 1
#define rs p << 1 | 1
const int N = 2e5 + 3;
int n , m , q;
int a[N];
int t[N << 2] , tag[N << 2];
inline int read(){
int x = 0 , f = 1;
char ch = getchar();
while(ch > '9' || ch < '0'){
if(ch == '-') f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = (x << 3) + (x << 1) + (ch ^ 48);
ch = getchar();
}
return x * f;
}
inline void push_up(int p){
t[p] = t[ls] + t[rs];
}
inline void build(int p , int l , int r){
if(l == r){
t[p] = a[l];
return;
}
int mid = l + (r - l) / 2;
build(ls , l , mid);
build(rs , mid + 1 , r);
push_up(p);
}
inline void push_down(int p , int l , int r){
if(tag[p]){
int mid = l + (r - l) / 2;
tag[ls] += tag[p];
tag[rs] += tag[p];
t[ls] += (mid - l + 1) * tag[p];
t[rs] += (r - mid) * tag[p];
tag[p] = 0;
}
}
inline void update(int p , int l , int r , int ll , int rr , int d){
if(l > rr || r < ll) return;
if(l >= ll && r <= rr){
tag[p] += d;
t[p] += (r - l + 1) * d;
return;
}
push_down(p , l , r);
int mid = l + (r - l) / 2;
update(ls , l , mid , ll , rr , d);
update(rs , mid + 1 , r , ll , rr , d);
push_up(p);
}
inline int query(int p , int l , int r , int ll , int rr){
if(l > rr || r < ll) return 0;
if(l >= ll && r <= rr) return t[p];
push_down(p , l , r);
int mid = l + (r - l) / 2;
int res = query(ls , l , mid , ll , rr);
res += query(rs , mid + 1 , r , ll , rr);
return res;
}
inline int solve(int p , int l , int r , int s , int q){
if(l == r) return l;
push_down(p , l , r);
int mid = l + (r - l) / 2;
if(t[ls] * q >= s) return solve(ls , l , mid , s , q);
else return solve(rs , mid + 1 , r , s - t[ls] * q , q);
}
signed main(){
n = ra , q = ra , m = ra;
for(int i = 1 ; i <= n ; i++) a[i] = ra;
build(1 , 1 , n);
int l , r , d;
for(int i = 1 ; i <= q ; i++){
cin >> l >> r >> d;
update(1 , 1 , n , l , r , d);
int q = log2(m / t[1] + 1);
int ans = q * n;
q = 1ll << q;
int s = m - (q - 1) * t[1];
if(!s) cout << ans - 1 << '\n';
else cout << ans + solve(1 , 1 , n , s , q) - 1 << '\n';
}
return 0;
}
以及为什么将代码中
if(!s) cout << ans - 1 << '\n';
改成
if(s <= 0) cout << ans - 1 << '\n';
会wa