#include<bits/stdc++.h>
#define ll long long
const int N=1e6+10;
using namespace std;
ll a[N];
struct tree{
ll l,r;
ll ad,dat;
}t[N];
inline void build(int q,ll l,ll r){
t[q].l=l,t[q].r=r;
if(l==r){
t[q].dat=a[l];
return;
}
ll mid=(t[q].l+t[q].r)>>1;
build(q<<1,l,mid);
build(q<<1|1,mid+1,r);
t[q].dat=t[q<<1].dat+t[q<<1|1].dat;
return;
}
inline void spread(int q){
if(t[q].ad){
t[q<<1].dat+=t[q].ad*(t[q<<1].r-t[q<<1].l+1);
t[q<<1|1].dat+=t[q].ad*(t[q<<1|1].r-t[q<<1|1].l+1);
t[q<<1].ad=t[q].ad;
t[q<<1|1].ad=t[q].ad;
t[q].ad=0;
}
}
inline void change(int q,ll l,ll r,ll d){
if(t[q].l>=l&&t[q].r<=r){
t[q].dat+=d*(t[q].r-t[q].l+1);
t[q].ad+=d;
return;
}
spread(q);
ll mid=(t[q].l+t[q].r)>>1;
if(l<=mid) change(q<<1,l,r,d);
if(r>mid) change(q<<1|1,l,r,d);
t[q].dat=t[q<<1].dat+t[q<<1|1].dat;
return;
}
inline ll solve(ll p,ll v,ll f){
ll l=t[p].l,r=t[p].r;
if(l==r) return l;
spread(p);
if(t[p<<1].dat*f<v)
return solve(p<<1|1,v-t[p<<1].dat*f,f);
return solve(p<<1,v,f);
}
int main(){
ios::sync_with_stdio(false);
int n,q,w;
cin>>n>>q>>w;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(q--){
ll l,r,d;
cin>>l>>r>>d;
change(1,l,r,d);
ll ans=0,f=1,v=w;
while(v>t[1].dat*f) {
v-=t[1].dat*f;
f<<=1;
ans+=n;
}
printf("%lld\n",ans+solve(1,v,f)-1);
}
return 0;
}