#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const int N=2e5+5;
int a[N];
struct stree{
ull tree[N<<2],tag[N<<2];
void push_up (int p)
{
tree[p]=tree[p<<1]+tree[p<<1|1];
}
void build (int p,int l,int r)
{
tag[p]=0;
if(l==r)
{
tree[p]=a[l];
return ;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
push_up(p);
}
void sdown (int p,ull k,int l,int r)
{
tag[p]+=k;
tree[p]+=(r-l+1)*k;
}
void push_down (int p,int l,int r)
{
int mid=(l+r)>>1;
sdown(p<<1,tag[p],l,mid);
sdown(p<<1|1,tag[p],mid+1,r);
tag[p]=0;
}
void update (int nl,int nr,int l,int r,int p,ull k)
{
if(nl<=l&&r<=nr)
{
sdown(p,k,l,r);
return ;
}
int mid=(l+r)>>1;
push_down(p,l,r);
if(nl<=mid) update (nl,nr,l,mid,p<<1,k);
if(nr>mid) update(nl,nr,mid+1,r,p<<1|1,k);
push_up(p);
}
ull query (int nl,int nr,int l,int r,int p)
{
if(nl<=l&&r<=nr) return tree[p];
ull res=0;
int mid=(l+r)>>1;
push_down(p,l,r);
if(nl<=mid) res+=query(nl,nr,l,mid,p<<1);
if(nr>mid) res+=query(nl,nr,mid+1,r,p<<1|1);
return res;
}
}T;
long long ans=0;
void sol (ull nw,int l,int r,int p,int id)
{
if(l==r)
{
ans+=l-1;
return ;
}
int mid=(l+r)>>1;
if(nw<=T.tree[p<<1]*id) sol(nw,l,mid,p<<1,id);
else sol(nw-T.tree[p<<1]*id,mid+1,r,p<<1|1,id);
}
int main()
{
int n,q;
ull w;
cin>>n>>q>>w;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
T.build(1,1,n);
while(q--)
{
int l,r,d;
scanf("%d%d%d",&l,&r,&d);
T.update(l,r,1,n,1,d);
ull sum=T.tree[1],id=1;
ull nw=w;
ans=0;
while(1)
{
if(nw<=sum*id) break;
nw-=sum*id;
id*=2;
ans+=n;
}
sol(nw,1,n,1,id);
printf("%lld\n",ans);
}
return 0;
}