#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 10;
struct Tree {
int val, lz, l, r;
}tr[N];
int n, Q, a[N], w;
string A;
void build(int id, int l, int r) {
tr[id].l = l, tr[id].r = r, tr[id].lz = 0;
if (l == r) {
tr[id].val = a[l];
return ;
}
int mid = (l + r) >> 1;
build(id * 2, l, mid);
build(id * 2 + 1, mid + 1, r);
tr[id].val = tr[id * 2].val + tr[id * 2 + 1].val;
}
void push_down(int id) {
tr[id * 2].lz += tr[id].lz;
tr[id * 2 + 1].lz += tr[id].lz;
tr[id * 2].val += (tr[id * 2].r - tr[id * 2].l + 1) * tr[id].lz;
tr[id * 2 + 1].val += (tr[id * 2 + 1].r - tr[id * 2 + 1].l + 1) * tr[id].lz;
tr[id].lz = 0;
}
void upd(int id, int l, int r, int k) {
if (l <= tr[id].l && tr[id].r <= r) {
tr[id].lz += k;
tr[id].val += (tr[id].r - tr[id].l + 1) * k;
return ;
}
push_down(id);
if (tr[id * 2].r >= l) upd(id * 2, l, r, k);
if (tr[id * 2 + 1].l <= r) upd(id * 2 + 1, l, r, k);
tr[id].val = tr[id * 2].val + tr[id * 2 + 1].val;
}
int sum(int id, int l, int r) {
if (l <= tr[id].l && tr[id].r <= r) {
return tr[id].val;
}
push_down(id);
int ans = 0;
if (tr[id * 2].r >= l) ans += sum(id * 2, l, r);
if (tr[id * 2 + 1].l <= r) ans += sum(id * 2 + 1, l, r);
return ans;
}
int solve(int x) {
int cnt = 0, y = x, kw = w;
int qwq = 0;
while (kw > 0) {
if (kw - y < 0) break;
kw -= y;
qwq += y;
y *= 2;
cnt++;
}
if (kw == 0) {
return cnt * n - 1;
}
int l = 1, r = n, ans = 0;
while (l <= r) {
int mid = (l + r) >> 1;
int s = sum(1, 1, mid) * (1<<cnt);
if (s + qwq >= w) r = mid - 1;
else {
l = mid + 1;
ans = mid;
}
}
return ans + cnt * n;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0) ;
cin >> n >> Q >> w;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
build(1, 1, n);
while (Q--) {
int l, r, d;
cin >> l >> r >> d;
upd(1, l, r, d);
cout << solve(sum(1, 1, n)) << '\n';
}
return 0;
}