#include<bits/stdc++.h>
#define int long long
#define ls now*2
#define rs now*2+1
using namespace std;
struct node{
int s,t,val,tag;
}tree[800005];
int a[200005],n,q,w;
void build(int l,int r,int now){
tree[now].s=l;
tree[now].t=r;
tree[now].tag=0;
if(l==r){
tree[now].val=a[l];
return;
}
int mid=(l+r)/2;
build(l,mid,ls);
build(mid+1,r,rs);
tree[now].val=tree[ls].val+tree[rs].val;
}
void push_down(int now){
tree[ls].tag+=tree[now].tag;
tree[rs].tag+=tree[now].tag;
tree[ls].val+=tree[now].tag*(tree[ls].t-tree[ls].s+1);
tree[rs].val+=tree[now].tag*(tree[rs].t-tree[rs].s+1);
tree[now].tag=0;
}
int query(int l,int r,int now){
if(r<l)return 0;
if(tree[now].s>=l&&tree[now].t<=r){
return tree[now].val;
}
if(tree[now].s>r||tree[now].t<l)return 0;
if(tree[now].tag!=0)push_down(now);
return query(l,r,ls)+query(l,r,rs);
}
void modify(int l,int r,int now,int k){
if(tree[now].s>=l&&tree[now].t<=r){
tree[now].tag+=k;
tree[now].val+=k*(tree[now].t-tree[now].s+1);
return;
}
if(tree[now].s>r||tree[now].t<l)return;
if(tree[now].tag!=0)push_down(now);
modify(l,r,ls,k);modify(l,r,rs,k);
tree[now].val=tree[ls].val+tree[rs].val;
}
inline int read(){
int f=1,x=0;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while('0'<=ch&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
inline void print(int x){
if(x<0){
putchar('-');
print(-x);
return;
}
if(x>9){
print(x/10);
}
putchar(x%10+'0');
}
signed main(){
n=read();
q=read();
w=read();
for(int i=1;i<=n;i++){
a[i]=read();
}
build(1,n,1);
while(q--){
int l,r,d;
l=read();
r=read();
d=read();
modify(l,r,1,d);
int sum=query(1,n,1),p=2,tgt,t;
for(int i=1;i<=10000000000;i++){
if((p-1)*sum>=w){
t=i-1;
tgt=w-(p/2-1)*sum;
break;
}
p*=2;
}
int left=0,right=n;
while(right-left>1){
int mid=(left+right)/2;
if(query(1,mid,1)*(1<<t)<tgt){
left=mid;
}
else right=mid;
}
print(t*n+left);
putchar('\n');
}
return 0;
}