rt
#include<bits/stdc++.h>
#define now sgt[p]
#define _ls p<<1
#define _rs p<<1|1
#define ls sgt[_ls]
#define rs sgt[_rs]
#define root sgt[1]
typedef long long ll;
using namespace std;
const int maxi=2e5+9;
struct node{
ll sum;
int s,t,m,laz;
}sgt[maxi<<2];
ll W;
int N,Q,a[maxi],L,R,D,ans,T;
inline void update(int p){now.sum=ls.sum+rs.sum;}
inline void pushdown(int p){
if(now.laz){
ls.sum+=1ll*now.laz*(ls.t-ls.s+1);
ls.laz+=now.laz;
rs.sum+=1ll*now.laz*(rs.t-rs.s+1);
rs.laz+=now.laz;
now.laz=0;
}
return;
}
inline void look(int p){
cerr<<"p="<<p
<<",sum="<<now.sum
<<",s="<<now.s
<<",t="<<now.t
<<",m="<<now.m<<'\n';
}
void check(int p){
if(now.s==now.t){
look(p);return;
}
pushdown(p);update(p);
check(_ls),check(_rs);
}
void build(int s,int t,int p){
now.s=s,now.t=t,now.m=(s+t)>>1;
if(s==t){
now.sum=1ll*a[s];return;
}
build(s,now.m,_ls);
build(now.m+1,t,_rs);
update(p);
return;
}
void wt(int p){
//look(p);
if(L<=now.s&&now.t<=R){
now.sum+=1ll*D*(now.t-now.s+1);
now.laz+=D;
//look(p);
return;
}
pushdown(p);
if(L<=now.m)wt(_ls);
if(now.m+1<=R)wt(_rs);
update(p);
//look(p);
return;
}
inline void comp(){
ll tmp=0;
for(int i=1;i<=N;i++)tmp+=1ll*a[i];
cerr<<"tmp="<<tmp<<",sum="<<root.sum<<'\n';
}
void bound(int p,ll res){
//cerr<<"res="<<res<<'\n';
if((now.sum<<T)==res||now.s==now.t){
ans+=now.t-1;return;
}
//look(_ls);
pushdown(p);
if((ls.sum)>=(res>>T))bound(_ls,res);
else bound(_rs,res-(ls.sum<<T));
update(p);
return;
}
int main(){
//freopen("wxyt2.in","r",stdin);
//freopen("out.out","w",stdout);
cin>>N>>Q>>W;
for(int i=1;i<=N;i++)scanf("%d",&a[i]);
build(1,N,1);
//comp();
//check(1);
for(int i=1;i<=Q;i++){
scanf("%d%d%d",&L,&R,&D);
wt(1);
//comp();
//look(1);
//check(1);
ans=0,T=0;ll tmp=W;
for(;;){
if((root.sum<<T)>=(tmp))break;
tmp-=root.sum<<T;
T++,ans+=N;
}
//cerr<<"T="<<T
// <<",ans="<<ans<<'\n';
bound(1,tmp);
printf("%d\n",ans);
}
return 0;
}