#include <bits/stdc++.h>
using namespace std;
long long treeA[200050 << 1], treeB[200050 << 1], contain[200050 << 1];
int n, k, a, b, q;
int di, ai, pi;
inline void init() {
  for (int i = 0; i < n; ++i) contain[n + i] = 1;
  for (int i = n - 1; i > 0; --i)
    contain[i] = contain[i << 1] + contain[(i << 1) | 1];
}
inline void update() {
  int d = di + n;
  treeA[d] += ai;
  treeB[d] += ai;
  for (d >>= 1; d; d >>= 1) {
    long long z1 = treeB[d << 1];
    long long z2 = treeB[(d << 1) | 1];
    if (contain[d << 1] == 1) z1 = min(z1, 1LL * b);
    if (contain[(d << 1) | 1] == 1) z2 = min(z2, 1LL * b);
    treeB[d] = z1 + z2;
    z1 = treeA[d << 1];
    z2 = treeA[(d << 1) | 1];
    if (contain[d << 1] == 1) z1 = min(z1, 1LL * a);
    if (contain[(d << 1) | 1] == 1) z2 = min(z2, 1LL * a);
    treeA[d] = z1 + z2;
  }
}
inline long long queryA(int l, int r) {
  long long ret = 0;
  for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
    if (l & 1) {
      long long z = treeA[l++];
      if (contain[l - 1] == 1) z = min(z, 1LL * a);
      ret += z;
    }
    if (r & 1) {
      long long z = treeA[--r];
      if (contain[r] == 1) z = min(z, 1LL * a);
      ret += z;
    }
  }
  return ret;
}
inline long long queryB(int l, int r) {
  long long ret = 0;
  for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
    if (l & 1) {
      long long z = treeB[l++];
      if (contain[l - 1] == 1) z = min(z, 1LL * b);
      ret += z;
    }
    if (r & 1) {
      long long z = treeB[--r];
      if (contain[r] == 1) z = min(z, 1LL * b);
      ret += z;
    }
  }
  return ret;
}
int main() {
  scanf("%d %d %d %d %d", &n, &k, &a, &b, &q);
  init();
  while (q--) {
    int t;
    scanf("%d", &t);
    if (t == 1) {
      scanf("%d %d", &di, &ai);
      --di;
      update();
    } else {
      scanf("%d", &pi);
      --pi;
      long long ans = queryB(0, pi) + queryA(pi + k, n);
      printf("%I64d\n", ans);
    }
  }
  return 0;
}
