#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
long long n,q,w,a[214514],lll,rrr,d,aa[214514];
struct node
{
ll l,r,v,tag1,tag2;
}tri[1000040];
void build(int p,int l,int r)
{
tri[p].l=l;tri[p].r=r;tri[p].tag1=0;tri[p].tag2=0;
if(l==r)
{
tri[p].v=a[l]; return;
}
ll mid=(l+r)/2;
build(p*2,l,mid); build(p*2+1,mid+1,r);
tri[p].v=tri[p*2].v+tri[p*2+1].v;
}
void f(int p,int k)
{
tri[p].tag1+=k;
tri[p].v+=(tri[p].r-tri[p].l+1)*k;
}
void f2(int p,int k)
{
tri[p].tag2=1;
tri[p].v+=(tri[p].r-tri[p].l+1)*k;
}
void pushdown(int p)
{
f(p*2,tri[p].tag1);
f(p*2+1,tri[p].tag1);
tri[p].tag1=0;
// f2(p*2,tri[p].tag2);
// f2(p*2+1,tri[p].tag2);
// tri[p].tag2=1;
}
void update(int p,int l,int r,long long k)
{
if(tri[p].l>=l&&tri[p].r<=r)
{
f(p,k); return;
}
// if(tri[p].l>=l&&tri[p].r<=r&&bb==1)
// {
// f2(p,k); return;
// }
pushdown(p);
ll mid=(tri[p].l+tri[p].r)/2;
if(l<=mid) update(p*2,l,r,k);
if(r>mid) update(p*2+1,l,r,k);
tri[p].v=tri[p*2].v+tri[p*2+1].v;
}
ll query(int p,int l,int r)
{
if(tri[p].l>=l&&tri[p].r<=r) return tri[p].v;
pushdown(p);
ll mid=(tri[p].l+tri[p].r)/2,ret=0;
if(l<=mid) ret+=query(p*2,l,r);
if(r>mid) ret+=query(p*2+1,l,r);
return ret;
}
bool check(long long t)
{
int temp=1;
__int128 ww=w;
ww-=(query(1,1,t%n)<<(t/n+1))-query(1,1,t%n);
if(ww<=0)
return 0;
if(t/n>0)
ww-=(query(1,t%n+1,n)<<(t/n))-query(1,t%n+1,n);
if(ww<=0)
return 0;
return 1;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>q>>w;
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
while(q--)
{
scanf("%lld%lld%lld",&lll,&rrr,&d);
update(1,int(lll),int(rrr),d);
long long ll=0,rr=60*n,mid;
while(ll<rr)
{
mid=(ll+rr)/2;
if(check(mid))
ll=mid+1;
else
rr=mid;
}
printf("%lld\n",ll-1);
}
return 0;
}
0pts,#1~#8WA,其余TLE