#include<iostream>
#define int long long
#define lson (u<<1)
#define rson (u<<1|1)
using namespace std;
const int N=2e5+10;
int n,q,w;
int a[N];
struct tr{
int l,r,sum,lazy;
}tree[N*4];
void pushup(int u){
tree[u].sum=tree[lson].sum+tree[rson].sum;
}
void build(int u,int l,int r){
tree[u]={l,r,0};
if(l==r){
tree[u].sum=a[l];
return ;
}
int mid=l+r>>1;
build(lson,l,mid);
build(rson,mid+1,r);
pushup(u);
}
void pushdown(int u){
if(tree[u].lazy){
tree[lson].sum+=(tree[lson].r-tree[lson].l+1)*tree[u].lazy;
tree[rson].sum+=(tree[rson].r-tree[rson].l+1)*tree[u].lazy;
tree[lson].lazy+=tree[u].lazy;
tree[rson].lazy+=tree[u].lazy;
tree[u].lazy=0;
}
return ;
}
void modify(int u,int l,int r,int d){
if(l<=tree[u].l&&tree[u].r<=r){
tree[u].sum+=(tree[u].r-tree[u].l+1)*d;
tree[u].lazy+=d;
return ;
}
pushdown(u);
int mid=tree[u].l+tree[u].r>>1;
if(l<=mid) modify(lson,l,r,d);
if(mid<r) modify(rson,l,r,d);
pushup(u);
}
int query(int u,int l,int r){
if(l<=tree[u].l&&tree[u].r<=r){
return tree[u].sum;
}
pushdown(u);
int mid=tree[u].l+tree[u].r>>1;
int ans=0;
if(l<=mid) ans+=query(lson,l,r);
if(mid<r) ans+=query(rson,l,r);
return ans;
}
int fun(int fac,int t){
int l=1,r=n;
while(l<r){
int mid=(l+r+1)>>1;
if(query(1,1,mid)*fac>=t) r=mid-1;
else l=mid;
}
return l;
}
signed main(){
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
cin>>n>>q>>w;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(q--){
int l,r,d;
cin>>l>>r>>d;
modify(1,l,r,d);
int t=w,sum=query(1,1,n),ans=0,ti=1;
while(t-(sum*ti)>0){
t=t-sum*ti;
ans+=n;
ti*=2;
}
ans+=fun(ti,t);
cout<<ans<<"\n";
}
return 0;
}