#include <bits/stdc++.h>
using namespace std;
typedef struct node {
  int l;
  int r;
  int l1;
  int r1;
  int len1;
  int len2;
  int len;
  int flag;
} node;
node d[105000 << 2];
int pos[105000];
int change[105000];
void up(int root) {
  d[root].l1 = d[root << 1].l1;
  d[root].r1 = d[root << 1 | 1].r1;
  d[root].len = max(d[root << 1].len, d[root << 1 | 1].len);
  if (d[root << 1].r1 == 0 && d[root << 1].r1 == d[root << 1 | 1].l1) {
    d[root].len = max(d[root].len, d[root << 1].len2 + d[root << 1 | 1].len1);
    if (d[root << 1].len1 == (d[root << 1].r - d[root << 1].l + 1))
      d[root].len1 = d[root << 1].len1 + d[root << 1 | 1].len1;
    else
      d[root].len1 = d[root << 1].len1;
    if (d[root << 1 | 1].len2 == (d[root << 1 | 1].r - d[root << 1 | 1].l + 1))
      d[root].len2 = d[root << 1 | 1].len2 + d[root << 1].len2;
    else
      d[root].len2 = d[root << 1 | 1].len2;
  } else {
    d[root].len1 = d[root << 1].len1;
    d[root].len2 = d[root << 1 | 1].len2;
  }
}
void push(int root) {
  if (d[root].flag == -1) return;
  d[root << 1].flag = d[root].flag;
  d[root << 1 | 1].flag = d[root].flag;
  int t = (d[root << 1].r - d[root << 1].l + 1) * (1 - d[root].flag);
  d[root << 1].l1 = d[root].flag;
  d[root << 1].r1 = d[root].flag;
  d[root << 1].len1 = t;
  d[root << 1].len2 = t;
  d[root << 1].len = t;
  t = (d[root << 1 | 1].r - d[root << 1 | 1].l + 1) * (1 - d[root].flag);
  d[root << 1 | 1].l1 = d[root].flag;
  d[root << 1 | 1].r1 = d[root].flag;
  d[root << 1 | 1].len1 = t;
  d[root << 1 | 1].len2 = t;
  d[root << 1 | 1].len = t;
  d[root].flag = -1;
}
void built(int root, int l, int r) {
  if (l == r) {
    d[root].l = l;
    d[root].r = r;
    d[root].l1 = 0;
    d[root].r1 = 0;
    d[root].len1 = 1;
    d[root].len2 = 1;
    d[root].len = 1;
    d[root].flag = -1;
    return;
  }
  int mid = (l + r) >> 1;
  built(root << 1, l, mid);
  built(root << 1 | 1, mid + 1, r);
  d[root].l = d[root << 1].l;
  d[root].r = d[root << 1 | 1].r;
  d[root].flag = -1;
  up(root);
}
void update(int root, int l, int r, int t) {
  if (l <= d[root].l && d[root].r <= r) {
    int tt = (1 - t) * (d[root].r - d[root].l + 1);
    d[root].flag = t;
    d[root].l1 = t;
    d[root].r1 = t;
    d[root].len1 = tt;
    d[root].len2 = tt;
    d[root].len = tt;
    return;
  }
  int mid = (d[root].l + d[root].r) >> 1;
  push(root);
  if (l <= mid) update(root << 1, l, r, t);
  if (r > mid) update(root << 1 | 1, l, r, t);
  up(root);
}
int ans;
void querty(int root, int t) {
  if (d[root].r - d[root].l + 1 < t) return;
  if (d[root].len < t) return;
  if (d[root].l == d[root].r) return;
  if (d[root << 1].len >= t)
    querty(root << 1, t);
  else {
    if (d[root << 1].r1 == 0 && d[root << 1].r1 == d[root << 1 | 1].l1 &&
        (d[root << 1].len2 + d[root << 1 | 1].len1) >= t)
      ans = (d[root << 1].r - d[root << 1].len2 + 1);
    else
      querty(root << 1 | 1, t);
  }
}
int main() {
  int n, b, f;
  scanf("%d%d%d", &n, &b, &f);
  int l = n + b + f;
  int m;
  scanf("%d", &m);
  built(1, 1, l);
  int t1, t2;
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &t1, &t2);
    if (t1 == 1) {
      if (d[1].len < (b + f + t2)) {
        printf("-1\n");
        continue;
      }
      querty(1, b + f + t2);
      pos[i] = ans;
      change[i] = t2;
      printf("%d\n", ans - 1);
      update(1, ans + b, ans + b + t2 - 1, 1);
    } else {
      update(1, pos[t2] + b, pos[t2] + b + change[t2] - 1, 0);
    }
  }
  return 0;
}
