#include <bits/stdc++.h>
using namespace std;
const int M = 5e6 + 10;
struct node {
  int l, r, za, zb;
};
node tr[M];
int arr[M], n, k, a, b, q;
void build(int lf, int rg, int t) {
  tr[t].l = lf;
  tr[t].r = rg;
  if (lf == rg) return;
  build(lf, (lf + rg) / 2, 2 * t);
  build((lf + rg) / 2 + 1, rg, 2 * t + 1);
  tr[t].za = tr[t].zb = 0;
}
void update(int d, int ai, int t) {
  tr[t].za += max(0, min(a - arr[d], ai));
  tr[t].zb += max(0, min(b - arr[d], ai));
  if (tr[t].l == tr[t].r) return;
  if (d <= tr[2 * t].r)
    update(d, ai, 2 * t);
  else
    update(d, ai, 2 * t + 1);
}
int bquery(int lf, int rg, int t) {
  if (lf > rg) return 0;
  if (lf == tr[t].l && rg == tr[t].r) return tr[t].zb;
  if (rg <= tr[2 * t].r) return bquery(lf, rg, 2 * t);
  if (lf >= tr[2 * t + 1].l) return bquery(lf, rg, 2 * t + 1);
  return bquery(lf, tr[2 * t].r, 2 * t) +
         bquery(tr[2 * t + 1].l, rg, 2 * t + 1);
}
int aquery(int lf, int rg, int t) {
  if (lf > rg) return 0;
  if (lf == tr[t].l && rg == tr[t].r) return tr[t].za;
  if (rg <= tr[2 * t].r) return aquery(lf, rg, 2 * t);
  if (lf >= tr[2 * t + 1].l) return aquery(lf, rg, 2 * t + 1);
  return aquery(lf, tr[2 * t].r, 2 * t) +
         aquery(tr[2 * t + 1].l, rg, 2 * t + 1);
}
int main() {
  cin >> n >> k >> a >> b >> q;
  build(1, n, 1);
  while (q--) {
    int t;
    cin >> t;
    if (t == 1) {
      int d, ai;
      cin >> d >> ai;
      update(d, ai, 1);
      arr[d] += ai;
    }
    if (t == 2) {
      int p;
      cin >> p;
      cout << bquery(1, p - 1, 1) + aquery(p + k, n, 1) << endl;
      ;
    }
  }
  return 0;
}
