#include <iostream>
#include <cassert>
using namespace std;
using ll=long long;
const int MN=2e5+13;
const int inf32=1e9;
const ll inf64=1e18;
int H, W, N; ll X;
namespace seg
{
int st[MN<<5], te[MN<<5], mid[MN<<5];
ll mx[MN<<5], lz[MN<<5];
int lp[MN<<5], rp[MN<<5], idx=0;
int build(int l, int r)
{
int u=++idx;
st[u]=l; te[u]=r; mid[u]=(st[u]+te[u])>>1;
mx[u]=lz[u]=0;
return u;
}
void build(int u)
{
if (!lp[u]) lp[u]=build(st[u], mid[u]);
if (!rp[u]) rp[u]=build(mid[u]+1, te[u]);
}
void prop(int u)
{
if (!lz[u]) return;
mx[lp[u]]+=lz[u];
lz[lp[u]]+=lz[u];
mx[rp[u]]+=lz[u];
lz[rp[u]]+=lz[u];
lz[u]=0;
}
void upd(int u, int l, int r, ll x)
{
if (st[u]==l && te[u]==r)
{
mx[u]+=x;
lz[u]+=x;
return;
}
build(u);
prop(u);
if (l<=mid[u]) upd(lp[u], l, min(r, mid[u]), x);
if (r>mid[u]) upd(rp[u], max(mid[u]+1, l), r, x);
mx[u]=max(mx[lp[u]], mx[rp[u]]);
}
int qrymin(int u)
{
if (mx[u]<X) return inf32;
if (st[u]==te[u]) return st[u];
build(u);
prop(u);
if (mx[lp[u]]>=X) return qrymin(lp[u]);
else return qrymin(rp[u]);
}
int qrymax(int u)
{
if (mx[u]<X) return -inf32;
if (st[u]==te[u]) return st[u];
build(u);
prop(u);
if (mx[rp[u]]>=X) return qrymax(rp[u]);
else return qrymax(lp[u]);
}
}
int main()
{
cin>>H>>W>>N>>X;
assert(W==1);
seg::build(1, H);
while (N--)
{
int U, D, L, R; ll C; cin>>U>>D>>L>>R>>C;
assert(L==1 && R==1);
seg::upd(1, U, D, C);
ll minpos=seg::qrymin(1), maxpos=seg::qrymax(1);
if (minpos==inf32)
{
assert(maxpos==-inf32);
cout<<0<<endl;
}
else cout<<maxpos-minpos+1<<endl;
}
return 0;
}