#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int n,q;
long long w;
long long a[200005];
struct Tree{
int l,r,siz;
long long tag,val;
}t[8000005];
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
void build(int x,int l,int r){
t[x].l=l,t[x].r=r,t[x].siz=r-l+1;
t[x].tag=0;
if(l==r){
t[x].val=a[l];
return;
}
int mid=(l+r)/2;
build(ls(x),l,mid);
build(rs(x),mid+1,r);
t[x].val=t[ls(x)].val+t[rs(x)].val;
return;
}
void pushdown(int x){
t[ls(x)].val+=t[x].tag*t[ls(x)].siz;
t[rs(x)].val+=t[x].tag*t[rs(x)].siz;
t[ls(x)].tag+=t[x].tag;
t[rs(x)].tag+=t[x].tag;
t[x].tag=0;
t[x].val=t[ls(x)].val+t[rs(x)].val;
return;
}
void add(int x,int ll,int rr,long long val){
if(t[x].l>rr||t[x].r<ll){
return;
}
if(t[x].l>=ll&&t[x].r<=rr){
t[x].val+=val*t[x].siz;
t[x].tag+=val;
return;
}
pushdown(x);
add(ls(x),ll,rr,val);
add(rs(x),ll,rr,val);
t[x].val=t[ls(x)].val+t[rs(x)].val;
return;
}
long long query(int x,int b,int w){
if(t[x].l==t[x].r) return (int)(b*t[x].val<w);
pushdown(x);
if(b*t[ls(x)].val<w) return t[ls(x)].siz+query(rs(x),b,w-b*t[ls(x)].val);
return query(ls(x),b,w);
}
int l,r;
long long d;
long long cnt,sum,res,ans,b;
long long fp[64];
long long Pow(long long a,long long b){
return fp[b];
}
signed main(){
fp[0]=1;
for(int i=1;i<=63;i++){
fp[i]=fp[i-1]*2;
}
scanf("%lld%lld%lld",&n,&q,&w);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,1,n);
while(q--){
cnt=0;
scanf("%lld%lld%lld",&l,&r,&d);
add(1,l,r,d);
sum=t[1].val;
res=w;
ans=1;
if(sum<w){
long long ll=1,rr=63;
while(ll<=rr){
long long mid=1ll*(ll+rr)/2;
long long x=1ll*(Pow(2,mid)-1);
long long y=w/sum;
if(x<=y){
ans=mid;
ll=mid+1;
}
else rr=mid-1;
}
//cout<<ans<<endl;
res=w-((Pow(2,ans)-1)*sum);
cnt=ans*n;
if(res==0){
printf("%lld\n",cnt-1);
continue;
}
//cout<<res<<endl;
}
b=Pow(2,ans);
int num=query(1,b,res);
printf("%lld\n",cnt+num);
}
return 0;
}