WA在了#11-#14,大点都过了小点反而没过去
#include<bits/stdc++.h>
#define lowbit(x) x&-x
using namespace std;
const int N=200050;
long long tre[N][2]={0},sum[N]={0};
void add(int x,long long k,int op)
{
for(int i=x;i<=N;i+=lowbit(i))
{
tre[i][op]+=k;
}
return ;
}
long long ask(int x,int op)
{
long long ans=0;
for(int i=x;i;i-=lowbit(i))
{
ans+=tre[i][op];
}
return ans;
}
int main()
{
//freopen("t1.in","r",stdin);
//freopen("t1.out","w",stdout);
int n,t;
long long w,sm;
scanf("%d%d%lld",&n,&t,&w);
for(int i=1;i<=n;i++)
{
scanf("%lld",&sum[i]);
sum[i]=sum[i-1]+sum[i];
}
sm=sum[n];
int x,y,tp;
long long z;
while(t--)
{
scanf("%d%d%lld",&x,&y,&z);
add(x,z,0);
add(y+1,-z,0);
add(x,x*z,1);
add(y+1,-(y+1)*z,1);
sm+=(long long)(y-x+1)*z;
for(int i=1;i<=64;i++)
{
if(w<=(unsigned long long)sm*((1<<i)-1))
{
tp=i-1;
break;
}
}
int l=1,r=n;
while(l<r)
{
int mid=(l+r)/2;
long long ans=(sum[mid]+(mid+1)*ask(mid,0)-ask(mid,1));
if((1<<tp)*ans+(((1<<tp)-1)*sm)<w)l=mid+1;
else r=mid;
}
printf("%d\n",tp*n+l-1);
}
return 0;
}