#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2e5+10;
template<typename T>void read(T &x){
int f=1;x=0;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^48);
x*=f;
}
int n,q,ans;
ll W;
int a[maxn],c1[maxn],c2[maxn];
int lowbit(int x){
return x&(-x);
}
void Add(int x,int d){
for(int i=x;i<=n;i+=lowbit(i)){
c1[i]+=d;
c2[i]+=x*d;
}
}
ll Sum(int x){
ll ret=0;
for(int i=x;i;i-=lowbit(i)){
ret+=(x+1)*c1[i]-c2[i];
}
return ret;
}
ll query(int l,int r){
return Sum(r)-Sum(l-1);
}
void update(int l,int r,int d){
Add(l,d);Add(r+1,-d);
}
int solve(int x){
int l=0,r=n,ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(Sum(mid)*x<W) l=mid+1,ans=mid;
else r=mid-1;
}
return ans;
}
int main(){
scanf("%d%d%lld",&n,&q,&W);
ll d=W;
for(int i=1;i<=n;i++) read(a[i]);
for(int i=1;i<=n;i++) update(i,i,a[i]);
while(q--){
ans=0;
W=d;
int l,r,d;
read(l);read(r);read(d);
update(l,r,d);
ll f=query(1,n);
ll k=W;
int cnt=0;
while(k>0){
k-=f;
if(k>0){
cnt++;
W-=f;
}
f*=2;
}
ans+=cnt*n;
int lg=pow(2,cnt);
ans+=solve(lg);
printf("%d\n",ans);
}
return 0;
}