#include <bits/stdc++.h>
using namespace std;
//O(玄学)//who cares?
#define maxn 1008611
int n,q,w;
int a[maxn];
int k[maxn];
int lz_ta[maxn];
int read(){
int x=0,f=1;
char cn=getchar();
while(cn<'0'||cn>'9'){
if(cn=='-') f=1;
cin>>cn;
cn=getchar();
}
while(cn>='0'&&cn<='9') x=x*10+cn-'0',cn=getchar();return x*f;
}
void out(int a){
if(a/10) out(a/10);
putchar(a%10+'0');
}
int main(){
n=read();
q=read();
w=read();
int cw=w;
int knum=sqrt(n);
int zk=n-knum*knum;
for(int i=1;i<=n;++i) a[i]=read();
//cout<<knum<<endl;
for(int i=1;i<=knum+1;++i){
for(int j=(i-1)*knum+1;j<=min(i*knum,n);j++){
k[i]+=a[j];
}
}//初始化块
//for(int i=1;i<=knum+1;i++) cout<<k[i]<<" ";cout<<endl;
for(int i=1;i<=q;++i){//knum
//when used the number in the a[],plus the lazy tag
w=cw;
int l,r,d;
l=read();
r=read();
d=read();
l--;
r--;
int cnl=l/knum;
int cnr=r/knum;
if(l%knum!=0){
for(int j=l+1;j<=(cnl+1)*knum;++j)
a[j]+=d,k[cnl+1]+=d;
}
if(r%knum!=knum-1){
for(int j=cnr*knum+1;j<=r+1;++j)
a[j]+=d,k[cnr+1]+=d;
}
for(int j=cnl+1;j<=cnr;j++) lz_ta[j]+=d*knum;
//for(int j=1;j<=n;j++) cout<<a[j]<<" ";cout<<endl;
//for(int j=1;j<=knum+1;j++) cout<<k[j]<<" ";cout<<endl;
//for(int j=1;j<=knum+1;j++) cout<<lz_ta[j]<<" ";cout<<endl;
//标记和修改
int ans=0;
int djk=1;
int bs=1;
int flag=0;
while(w>0){
if(w-(k[djk]+lz_ta[djk])*bs<=0){
for(int j=(djk-1)*knum+1;j<=djk*knum;++j){
w-=(a[j]+lz_ta[djk]/knum)*bs;
//cout<<"w:"<<w<<endl;
if(w<=0){
out(ans);
putchar('\n');
flag=1;
break;
}
ans++;
}
}//如果这个块打死了
if(flag==1) break;
w-=(k[djk]+lz_ta[djk])*bs;
//cout<<k[djk]*bs<<" "<<w<<endl;
if(djk==knum+1){
bs*=2;
djk=1;
ans+=n-knum*knum;
}
else{
ans+=knum;++djk;
}//打并且翻倍
}
}
return 0;
}