#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,q;
long long sum,W;
long long a[200005<<2];
void build(int u,int L,int R)
{
if(L==R)
{
scanf("%lld",&a[u]);
sum+=a[u];
return;
}
int mid=L+R>>1;
int ls=u<<1,rs=u<<1|1;
build(ls,L,mid),build(rs,mid+1,R);
a[u]=a[ls]+a[rs];
}
int l,r,d;
long long lazy[200005<<2];
void pushdown(int u,int L,int R)
{
int mid=L+R>>1;
int ls=u<<1,rs=u<<1|1;
lazy[ls]+=lazy[u];
lazy[rs]+=lazy[u];
a[ls]+=lazy[u]*(mid-L+1),a[rs]+=lazy[u]*(R-mid);
lazy[u]=0;
}
void update(int u,int L,int R)
{
if(L>r||R<l) return;
if(lazy[u]&&L!=R)pushdown(u,L,R);
if(l<=L&&R<=r)
{
lazy[u]+=d;
a[u]+=1LL*(R-L+1)*d;
return;
}
if(L==R) return;
int mid=L+R>>1;
int ls=u<<1,rs=u<<1|1;
update(ls,L,mid),update(rs,mid+1,R);
a[u]=a[ls]+a[rs];
}
int query(int u,int L,int R,long long k)
{
if(L==R)return L;
if(lazy[u])pushdown(u,L,R);
int mid=L+R>>1;
int ls=u<<1,rs=u<<1|1;
if(a[ls]>=k) return query(ls,L,mid,k);
return query(rs,mid+1,R,k-a[ls]);
}
signed main()
{
scanf("%lld%lld%lld",&n,&q,&W);
build(1,1,n);
while(q--)
{
scanf("%lld%lld%lld",&l,&r,&d);
update(1,1,n);
sum+=1LL*(r-l+1)*d;
long long kk=log2(W/sum+1);
long long lft=W-sum*((1<<kk)-1);
if(!lft)
{
printf("%lld\n",kk*n-1);
continue;
}
if(kk)
lft/=(1<<kk);
long long ans=query(1,1,n,lft)-1+kk*n;
printf("%lld\n",ans);
}
return 0;
}