#include<bits/stdc++.h>
#define ri register int
#define ll unsigned long long
#pragma G++ optimize(3)
using namespace std;
ll l[800010],r[800010],sum[800010],lz[800010],n,q,w,summ;
void u(int k)
{
sum[k]=sum[k<<1]+sum[k<<1|1];
}
void d(int k)
{
if(l[k]==r[k])return;
sum[k<<1]+=(r[k<<1]-l[k<<1]+1)*lz[k];
sum[k<<1|1]+=(r[k<<1|1]-l[k<<1|1]+1)*lz[k];
lz[k<<1]+=lz[k];
lz[k<<1|1]+=lz[k];
lz[k]=0;
}
void build(int k,int L,int R)
{
l[k]=L,r[k]=R,lz[k]=0;
if(L==R)
{
scanf("%lld",&sum[k]);
summ+=sum[k];
return;
}
int mid=(L+R)>>1;
build(k<<1,L,mid);
build(k<<1|1,mid+1,R);
u(k);
}
void update(int k,int L,int R,ll v)
{
//cout<<l[k]<<" "<<r[k]<<endl;
if(L<=l[k]&&r[k]<=R)
{
lz[k]+=v;
sum[k]+=(r[k]-l[k]+1)*v;
return;
}
ll mid=(l[k]+r[k])>>1;
d(k);
if(L<=mid)update(k<<1,L,R,v);
if(R>mid)update(k<<1|1,L,R,v);
u(k);
}
ll query(int k,int L,int R)
{
if(L<=l[k]&&r[k]<=R)return sum[k];
ll mid=(l[k]+r[k])>>1,res=0;
d(k);
if(L<=mid)res+=query(k<<1,L,R);
if(R>mid)res+=query(k<<1|1,L,R);
//cout<<res<<endl;
return res;
}
ll erfen(int L,int R,int k,int lg)
{
//cout<<k<<endl;
int cnt=0;
while(L<=R)
{
int mid=(L+R)>>1;
ll res;
res=query(1,1,mid)*lg;
if(res>=k)R=mid-1;
else L=mid+1,cnt=mid;
//cout<<L<<" "<<R<<endl;
}
return cnt;
}
int main()
{
scanf("%llu%llu%llu",&n,&q,&w);
build(1,1,n);
while(q--)
{
ll L,R,d,W=w,lg=1LL,ans=0,ss;
scanf("%llu%llu%llu",&L,&R,&d);
update(1,L,R,d);
summ=query(1,1,n);
//cout<<summ*lg<<endl;
while(W>summ*lg)
{
W-=summ*lg;
ans+=n;
lg*=2LL;
}
printf("%llu\n",ans+erfen(1,n,W,lg));
}
return 0;
}