#include<bits/stdc++.h>
using namespace std;
#define IOS
void ___()
{
#ifdef fileio
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#endif
#ifdef IOS
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define endl '\n'
#endif
}
#define ll long long
const int _mxn=2e5+5;
int n;
ll W,a[_mxn];
namespace segtree
{
struct node
{
int l,r;
ll sum,tag;
int len(){return r-l+1;}
}tr[_mxn<<2];
int ls(int p){return p<<1;}
int rs(int p){return p<<1|1;}
void pushup(int p)
{
tr[p].sum=tr[ls(p)].sum+tr[rs(p)].sum;
}
void build(int p,int l,int r)
{
tr[p].l=l,tr[p].r=r;
tr[p].tag=0;
if(l==r)
{
tr[p].sum=a[l];
return;
}
int mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
pushup(p);
}
void pushdown(int p)
{
ll t=tr[p].tag;
tr[p].tag=0;
tr[ls(p)].sum+=t*tr[ls(p)].len();
tr[rs(p)].sum+=t*tr[rs(p)].len();
tr[ls(p)].tag+=t;
tr[rs(p)].tag+=t;
}
void update(int p,int l,int r,ll k)
{
if(l<=tr[p].l&&tr[p].r<=r)
{
tr[p].sum+=k*tr[p].len();
tr[p].tag+=k;
return;
}
pushdown(p);
int mid=(tr[p].l+tr[p].r)>>1;
if(l<=mid)
update(ls(p),l,r,k);
if(mid<r)
update(rs(p),l,r,k);
pushup(p);
}
ll query(int p,int l,int r)
{
if(l<=tr[p].l&&tr[p].r<=r)
return tr[p].sum;
pushdown(p);
int mid=(tr[p].l+tr[p].r)>>1;
ll res=0;
if(l<=mid)
res+=query(ls(p),l,r);
if(mid<r)
res+=query(rs(p),l,r);
return res;
}
int queryp(int p,int l,int r,int rd,ll w)
{
if(l==r)
return l;
pushdown(p);
int mid=(l+r)>>1;
ll h=tr[ls(p)].sum*(1ll<<rd);
if(w>h)
return queryp(rs(p),mid+1,r,rd,w-h);
else
return queryp(ls(p),l,mid,rd,w);
}
}
int main()
{
___();
int q;
cin>>n>>q>>W;
for(int i=1;i<=n;i++)
cin>>a[i];
segtree::build(1,1,n);
while(q--)
{
int L,R;
ll d;
cin>>L>>R>>d;
segtree::update(1,L,R,d);
ll s=segtree::query(1,1,n);
ll w=W;
int rd=0;
while(114514<1919810)
{
if(w<=s)
break;
w-=s;
s*=2;
rd++;
}
cout<<rd*n+segtree::queryp(1,1,n,rd,w)-1<<endl;
}
return 0;
}