#include<bits/stdc++.h>
#define int long long
#define ls x<<1
#define rs x<<1|1
#define qmi int mid=(tree[x].l+tree[x].r)>>1
using namespace std;
int n,q,w,a[200005],sum;
struct node{
int l,r,sum,lasy;
}tree[800005];
inline void push_up(int x){
tree[x].sum=tree[ls].sum+tree[rs].sum;
return ;
}
inline void push_down(int x){
if(tree[x].lasy){
tree[ls].sum+=(tree[ls].r-tree[ls].l+1)*tree[x].lasy;
tree[rs].sum+=(tree[rs].r-tree[rs].l+1)*tree[x].lasy;
tree[ls].lasy+=tree[x].lasy;
tree[rs].lasy=tree[x].lasy;
tree[x].lasy=0;
}
return ;
}
inline void build(int x,int l,int r){
tree[x].l=l;
tree[x].r=r;
if(l==r){
tree[x].sum=a[l];
return ;
}
qmi;
build(ls,l,mid);
build(rs,mid+1,r);
push_up(x);
return ;
}
inline void update(int x,int l,int r,int d){
if(tree[x].l>=l&&tree[x].r<=r){
tree[x].sum+=(tree[x].r-tree[x].l+1)*d;
tree[x].lasy+=d;
return ;
}
push_down(x);
qmi;
if(l<=mid){
update(ls,l,r,d);
}
if(r>mid){
update(rs,l,r,d);
}
push_up(x);
}
inline int query(int x,int l,int r){
if(tree[x].l>=l&&tree[x].r<=r){
return tree[x].sum;
}
push_down(x);
int ans=0;
qmi;
if(l<=mid){
ans+=query(ls,l,r);
}
if(r>mid){
ans+=query(rs,l,r);
}
return ans;
}
inline int pw(int x,int p){
int ans=1;
while(p){
if(p%2==1){
if(w/ans<x){
return -1;
}
ans*=x;
}
p>>=1;
if(p>0&&w/x<x){
return -1;
}
x*=x;
}
return ans;
}
inline int read() {
int x = 0,f = 1;char v = getchar();
while (!isdigit(v)) {if (v =='-') f = -1;v = getchar();}
while (isdigit(v)) {x = x * 10 + v - 48;v = getchar();}
return x * f;
}
signed main(){
n=read();
q=read();
w=read();
for(int i=1;i<=n;i++){
a[i]=read();
sum+=a[i];
}
build(1,1,n);
while(q--){
int ll,rr,d,ans=0;
ll=read();
rr=read();
d=read();
update(1,ll,rr,d);
sum+=(rr-ll+1)*d;
int l=-1,r=log2(w*2)+1;
while(l+1<r){
int mid=(l+r)>>1;
int tem=pw(2,mid);
if(tem==-1||tem-1>w/sum){
r=mid;
}else{
l=mid;
}
}
int fl=l,tmp=pow(2,l),last=(tmp-1)*sum;
if(last==w){
cout<<l*n-1<<"\n";
continue;
}
l=0,r=n+1;
while(l+1<r){
int mid=(l+r)>>1;
if(query(1,1,mid)>=(w-last)/tmp){
r=mid;
}else{
l=mid;
}
}
cout<<fl*n+r-1<<"\n";
}
return 0;
}