#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF=0x3f3f3f3f3f3f3f3f;
const ll MOD=998244353;
const ll N=2e5+10;
const ll M=1e2+10;
ll n, T, m, a[N], c, u, o, f[N*4], tag[N*4], su, mc[M], tot, w1, w2;
void pd(ll rt, ll l, ll r) {
if(tag[rt]==0) return ;
ll mid=(l+r)>>1;
tag[(rt<<1)] += tag[rt];
tag[(rt<<1)+1] += tag[rt];
f[(rt<<1)] += tag[rt] * (mid-l+1);
f[(rt<<1)+1] += tag[rt] * (r-mid);
tag[rt] = 0;
}
void build(ll rt, ll l, ll r) {
if(l==r) {
f[rt] = a[l];
return ;
}
ll mid=(l+r)>>1;
build((rt<<1), l, mid);
build((rt<<1)+1, mid+1, r);
f[rt] = f[(rt<<1)] + f[(rt<<1)+1];
}
void upd(ll rt, ll l, ll r, ll ql, ll qr, ll k) {
if((ql<=l&&r<=qr)||l==r) {
f[rt] += (r-l+1) * k;
tag[rt] += k;
return ;
}
ll mid=(l+r)>>1;
pd(rt, l, r);
if(qr<=mid) upd((rt<<1), l, mid, ql, qr, k);
else if(mid<ql) upd((rt<<1)+1, mid+1, r, ql, qr, k);
else {
upd((rt<<1), l, mid, ql, mid, k);
upd((rt<<1)+1, mid+1, r, mid+1, qr, k);
}
f[rt] = f[(rt<<1)] + f[(rt<<1)+1];
}
ll ask(ll rt, ll l, ll r, ll ql, ll qr) {
if((ql<=l&&r<=qr)||l==r) return f[rt];
ll mid=(l+r)>>1;
pd(rt, l, r);
if(qr<=mid) return ask((rt<<1), l, mid, ql, qr);
else if(mid<ql) return ask((rt<<1)+1, mid+1, r, ql, qr);
else return ask((rt<<1), l, mid, ql, mid) + ask((rt<<1)+1, mid+1, r, mid+1, qr);
}
int main() {
scanf("%lld%lld%lld", &n, &T, &m);
mc[0] = 1LL;
for(; mc[tot]<=m; ) mc[++tot] = mc[tot-1] << 1;
for(ll i=0; i<=tot; i++) mc[i]--;
for(ll i=1; i<=n; i++) scanf("%lld", &a[i]);
build(1, 1, n);
while(T--) {
scanf("%lld%lld%lld", &c, &u, &o);
upd(1, 1, n, c, u, o);
su = f[1];
ll lc=1, rc=tot;
while(lc<rc) {
ll mid=(lc+rc)>>1;
w1=mc[mid], w2=su;
if(w1<w2) swap(w1, w2);
if(w1<(m+w2-1)/w2) lc = mid+1;
else rc = mid;
}
ll ln=1, rn=n;
while(ln<rn) {
ll mid=(ln+rn)>>1;
w1=ask(1, 1, n, 1, mid), w2=(mc[lc-1]+1);
if(w1<w2) swap(w1, w2);
if(w1<((m-mc[lc-1]*su)+w2-1)/w2) ln = mid+1;
else rn = mid;
}
printf("%lld\n", (lc-1)*n+ln-1);
}
return 0;
}
为何 0 分(WA + RE + TLE