#include<bits/stdc++.h>
#define ls now*2
#define rs now*2+1
#define int long long
using namespace std;
struct node{
int s,t,val,tag;
}tree[800005];
int a[200005],n,q,w,ans,t;
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;
}
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;
}
void query(int now,int tgt){
if(tree[now].s==tree[now].t)return;
if(tree[now].tag)push_down(now);
if(tree[ls].val*(1<<t)<tgt){
ans=max(ans,tree[ls].t);
query(rs,tgt-tree[ls].val*(1<<t));
}
if(tree[ls].val*(1<<t)>=tgt){
query(ls,tgt);
}
}
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(){
// freopen("wxyt3.in","r",stdin);
// freopen("wxyt3.out","w",stdout);
// ios::sync_with_stdio(0);
// cin.tie(0);
// cout.tie(0);
n=read();
q=read();
w=read();
int sum=0;
for(int i=1;i<=n;i++){
a[i]=read();
sum+=a[i];
}
build(1,n,1);
while(q--){
int l,r,k;
l=read();
r=read();
k=read();
modify(l,r,1,k);
sum+=k*(r-l+1);
int p=2,tgt;
for(int i=1;i<=10000000000;i++){
if((p-1)*sum>=w){
t=i-1;
tgt=w-(p/2-1)*sum;
break;
}
p*=2;
}
ans=0;query(1,tgt);
print(ans+n*t);
putchar('\n');
}
return 0;
}
大样例3过不了,具体输出就前几行不对