// #define _GLIBCXX_DEBUG // for STL debug (optional)
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <cfloat>
#include <climits>
#include <ctime>
#include <cassert>
#include <numeric>
#include <fstream>
#include <functional>
#include <bitset>
using namespace std;

#define debug(...) fprintf(stderr, __VA_ARGS__)
#define int long long int
 
template<typename T> void chmax(T &a, T b) {a = max(a, b);}
template<typename T> void chmin(T &a, T b) {a = min(a, b);}
template<typename T> void chadd(T &a, T b) {a = a + b;}
 
typedef pair<int, int> pii;
typedef long long ll;
 
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
const ll INF = 1001001001001001LL;
const ll MOD = 1000000007LL;

// 区間を set で管理するやつ
// 閉区間 [l, r] を扱うことに注意
template <typename numericType>
struct IntervalSet : set< pair<numericType, numericType> > {
    // x を含む閉区間 [l, r] を取得
    // イテレータを返す
    auto get(numericType x) {
        // x より始点が大きい区間の中で最小のもの
        auto itr = this->upper_bound(make_pair(x+1, x));
        if(itr == this->begin() or (--itr)->second < x) return this->end();
        return itr;
    }

    // [l, r] と overlap する区間の集合を取得
    // vector を返す
    vector< pair<numericType, numericType> > get(numericType l, numericType r) {
        auto itr = this->upper_bound(make_pair(l, l));
        if(itr != this->begin()) itr--;

        vector< pair<numericType, numericType> > res;
        for(; itr != this->end(); itr++) {
            numericType il, ir; tie(il, ir) = *itr;
            if(r < il) break; // 対称区間に対して右に飛び出た
            // 対称区間に対して左に飛び出るか、含まれているかしかない
            if(ir >= l) res.push_back(make_pair(il, ir));
        }
        return res;
    }
    
    void insert(numericType l, numericType r) {
        auto vec = this->get(l, r);
        numericType il = l, ir = r;
        for(auto e : vec) {
            this->erase(e);
            il = min(il, e.first);
            ir = max(ir, e.second);
        }
        this->emplace(il, ir);
    }
    
    void remove(numericType l, numericType r) {
        auto vec = this->get(l, r);
        for(auto e : vec) this->erase(e);
    }

    // p と q は同じ区間上にあるか？
    bool same(numericType p, numericType q) {
        auto itr = get(p);
        return itr != this->end() and itr->first <= q and q <= itr.second;
    }

    void dump() {
        for(auto e : *this) {
            numericType l, r; tie(l, r) = e;
            fprintf(stderr, "# debug: [%g, %g]\n", l, r);
        }
    }
};

signed main() {
    int N;
    while(cin >> N, N) {
        map< int, IntervalSet<int> > mp;
        mp[-1].insert(0, INF);

        for(int i=0; i<N; i++) {
            char com; cin >> com;
            if(com == 'W') {
                int id, len; cin >> id >> len;
                auto &S = mp[-1];

                vector< pair<int, int> > rem_list, ins_list;
                for(auto e : S) {
                    int l, r; tie(l, r) = e;
                    int lim = r - l + 1;

                    int use = min(len, lim);
                    if(use == lim) {
                        mp[id].insert(l, r);
                        rem_list.emplace_back(l, r);
                    }
                    else {
                        mp[id].insert(l, l + use - 1);
                        rem_list.emplace_back(l, r);
                        ins_list.emplace_back(l + use, r);
                    }
                    len -= use;
                    if(len == 0) break;
                }

                for(auto e : rem_list) {
                    int l, r; tie(l, r) = e;
                    // fprintf(stderr, "# remove: [%lld, %lld]\n", l, r);
                    mp[-1].remove(l, r);
                }
                for(auto e : ins_list) {
                    int l, r; tie(l, r) = e;
                    // fprintf(stderr, "# insert: [%lld, %lld]\n", l, r);
                    mp[-1].insert(l, r);
                }
            }
            if(com == 'R') {
                int pos; cin >> pos;

                // 破滅？
                int ans = -1;
                for(auto e : mp) {
                    if(e.first == -1) continue;
                    auto &S = e.second;
                    // fprintf(stderr, "e.first = %lld\n", e.first);
                    if(S.get(pos) != S.end()) {
                        ans = e.first;
                        break;
                    }
                }
                cout << ans << endl;
            }
            if(com == 'D') {
                int id; cin >> id;
                if(mp.count(id)) {
                    auto &S = mp[id];
                    for(auto itvl : S) {
                        int l, r; tie(l, r) = itvl;
                        mp[-1].insert(l, r);
                    }
                    mp[id].clear();
                }
            }
        }
        cout << endl;
    }
    return 0;
}



Measured memory_bytes: 3956