#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ls p << 1
#define rs p << 1 | 1
const int N = 2e5 + 5;
const ll mod = 19940417;
struct node
{
int l, r;
ll sum, laz;
}tree[N << 2];
int n, q;
ll a[N];
ll W;
void pushdown(int p)
{
if (tree[p].laz == 0) return;
tree[ls].laz += tree[p].laz, tree[rs].laz += tree[p].laz;
tree[ls].sum += (tree[ls].r - tree[ls].l + 1) * tree[p].laz;
tree[rs].sum += (tree[rs].r - tree[rs].l + 1) * tree[p].laz;
tree[p].laz = 0;
}
void build(int p, int l, int r)
{
tree[p].l = l, tree[p].r = r;
if (l == r)
{
tree[p].sum = a[l];
return;
}
int mid = tree[p].l + tree[p].r >> 1;
build(ls, l, mid);
build(rs, mid + 1, r);
tree[p].sum = tree[ls].sum + tree[rs].sum;
}
void modify(int p, int l, int r, ll k)
{
if (l <= tree[p].l && tree[p].r <= r)
{
tree[p].laz += k, tree[p].sum += (tree[p].r - tree[p].l + 1ll) * k;
return;
}
pushdown(p);
int mid = tree[p].l + tree[p].r >> 1;
if (l <= mid)
modify(ls, l, r, k);
if (r > mid)
modify(rs, l, r, k);
tree[p].sum = tree[ls].sum + tree[rs].sum;
}
ll query(int p, int l, int r)
{
if (l <= tree[p].l && tree[p].r <= r)
return tree[p].sum;
pushdown(p);
int mid = tree[p].l + tree[p].r >> 1;
ll res = 0;
if (l <= mid)
res += query(ls, l, r);
if (r > mid)
res += query(rs, l, r);
return res;
}
void solve()
{
scanf("%d%d%lld",&n,&q,&W);
for (int i = 1; i <= n; i ++)
scanf("%lld", &a[i]);
build(1, 1, n);
for (int i = 1; i <= q; i ++)
{
int l, r, p = 1;
ll d, sum = 0, ans = 0, w = W, cnt = 0, base = 2;
cin >> l >> r >> d;
modify(1, l, r, d);
sum = query(1, 1, n);
while (sum * (base - 1) < W)
base *= 2, cnt ++;
ans += cnt * n, w -= ((1ll << cnt) - 1) * sum;
while (tree[p].r > tree[p].l)
{
pushdown(p);
if (tree[ls].l > 0 && tree[ls].sum * (1ll << cnt) < w)
w -= tree[ls].sum * (1ll << cnt), p = rs;
else
p = ls;
}
printf("%lld\n", ans + tree[p].l - 1);
}
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
solve();
return 0;
}