#include <bits/stdc++.h>
using namespace std;
long long a[200005];
struct tree {
int l, r;
long long pre, add;
}t[900020];
void bulid(int p, int l, int r) {
t[p].l = l; t[p].r = r;
if (l == r) {
t[p].pre = a[l];
return;
}
int mid = (l + r )>> 1;
bulid(p * 2, l, mid);
bulid(p * 2 + 1, mid + 1, r);
t[p].pre = t[p * 2].pre + t[p * 2 + 1].pre;
}
void spread(int p) {
if (t[p].add)
{
t[p * 2].pre += t[p].add * (t[p * 2].r - t[p * 2].l + 1);
t[p * 2 + 1].pre += t[p].add * (t[p * 2 + 1].r - t[p * 2 + 1].l + 1);
t[p * 2].add += t[p].add;
t[p * 2 + 1].add += t[p].add;
t[p].add = 0;
}
}
void change(int p, int x, int y, long long z) {
if (x <= t[p].l && y >= t[p].r) {
t[p].pre += (long long)z * (t[p].r - t[p].l + 1);
t[p].add += z;
return;
}
spread(p);
int mid = (t[p].l + t[p].r) >> 1;
if (x <= mid) change(p * 2, x, y, z);
if (y > mid) change(p * 2 + 1, x, y, z);
t[p].pre = t[p * 2].pre + t[p * 2 + 1].pre;
}
long long ask(int p, int x, int y)
{
if ((x <= t[p].l) && (y >= t[p].r)) return t[p].pre;
spread(p);
int mid = (t[p].l + t[p].r) >> 1;
long long ans = 0;
if (x <= mid) ans += ask(p * 2, x, y);
if (y > mid) ans += ask(p * 2 + 1, x, y);
return ans;
}
long long dfs(int remain,int ter,int l,int r) {
for (int k = 1; k <= r; k++) {
if (ask(1, 1, k) * ter>= remain) {
return (k - 1);
}
}
}
int main() {
long long n, q, W;
cin >> n >> q >> W;
long long cnt = 0;
for (long long i = 1; i <= n; i++) {
cin >> a[i];
cnt += a[i];
}
bulid(1, 1, n);
for (long long j = 1; j <= q; j++) {
long long l, r, d;
long long hp = W;
cin >> l >> r >> d;
change(1, l, r, d);
long long sum=ask(1, 1, n);
long long shang = hp / sum;
long long shang1 = shang;
long long shang2 = shang;
bool checker = 1;
long long ans = -1;
while (shang1 >= 0) {
ans++;
shang2 = shang1;
shang1 -= (1 << ans);
if (shang1 < 0) break;
hp -= sum * (1 << ans);
}
long long turn = 1 << ans;
ans *= n;
if (hp == 0) {
cout <<( ans - 1 )<< endl;
continue;
}
ans+=dfs(hp, turn, 1, n);
cout << ans << endl;
}
return 0;
}