CF原题。。。刚开始做的时候SB的线段树套set。。。。结果在HDOJ上MLE。。。CF上TLE。。。后来换了姿势在HDOJ上过了。。。。但是CF还是TLE啊。。。优化不了了,求大牛指点。。。
#include <iostream>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <cmath>
#include <time.h>
#define maxn 200005
#define maxm 1000005
#define eps 1e-10
#define mod 1000000007
#define INF 0x3f3f3f3f
#define PI (acos(-1.0))
#define lowbit(x) (x&(-x))
#define mp make_pair
#define ls o<<1
#define rs o<<1 | 1
#define lson o<<1, L, mid
#define rson o<<1 | 1, mid+1, R
//#pragma comment(linker, "/STACK:16777216")
typedef long long LL;
typedef unsigned long long ULL;
//typedef int LL;
using namespace std;
LL qpow(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base;base=base*base;b/=2;}return res;}
LL powmod(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base%mod;base=base*base%mod;b/=2;}return res;}
// head
struct node
{
int x, y, k, id;
}p[maxn];
char ss[maxn];
int x[maxn];
int maxv[maxn << 2];
set<int> s[maxn];
set<int>::iterator it;
int cnt, n, ans_x, ans_y;
int cmp1(node a, node b)
{
return a.x < b.x;
}
int cmp2(node a, node b)
{
return a.id < b.id;
}
void init(void)
{
for(int i = 0; i < maxn; i++) s[i].clear();
}
void read(void)
{
for(int i = 1; i <= n; i++) {
scanf("%s%d%d", ss, &p[i].x, &p[i].y);
if(ss[0] == 'a') p[i].k = 1;
if(ss[0] == 'r') p[i].k = 2;
if(ss[0] == 'f') p[i].k = 3;
p[i].id = i;
}
sort(p+1, p+n+1, cmp1);
for(int i = 1; i <= n; i++) x[i] = p[i].x;
int j = 2;
for(int i = 2; i <= n; i++) if(x[i] != x[i-1]) x[j++] = x[i];
cnt = j-1;
for(int i = 1; i <= n; i++) p[i].x = lower_bound(x+1, x+cnt+1, p[i].x) - x;
sort(p+1, p+n+1, cmp2);
}
void pushup(int o)
{
maxv[o] = max(maxv[ls], maxv[rs]);
}
void build(int o, int L, int R)
{
maxv[o] = -1;
if(L == R) return;
int mid = (L + R) >> 1;
build(lson);
build(rson);
pushup(o);
}
void add(int o, int L, int R, int pos, int x)
{
if(L == R) {
maxv[o] = max(maxv[o], x);
return;
}
int mid = (L + R) >> 1;
if(pos <= mid) add(lson, pos, x);
else add(rson, pos, x);
pushup(o);
}
void remove(int o, int L, int R, int pos, int x)
{
if(L == R) {
if(s[L].empty()) maxv[o] = -1;
else maxv[o] = *(--s[L].end());
return;
}
int mid = (L + R) >> 1;
if(pos <= mid) remove(lson, pos, x);
else remove(rson, pos, x);
pushup(o);
}
void query(int o, int L, int R, int ql, int qr, int y)
{
if(ans_x != -1) return;
if(L == R) {
if(maxv[o] <= y) return;
ans_y = *(upper_bound(s[L].begin(), s[L].end(), y));
ans_x = L;
return;
}
int mid = (L + R) >> 1;
if(ql <= L && qr >= R) {
if(maxv[o] <= y) return;
else {
query(lson, ql, qr, y);
query(rson, ql, qr, y);
}
}
if(ql <= mid) query(lson, ql, qr, y);
if(qr > mid) query(rson, ql, qr, y);
}
void work(void)
{
build(1, 1, cnt+1);
for(int i = 1; i <= n; i++) {
if(p[i].k == 1) {
s[p[i].x].insert(p[i].y);
add(1, 1, cnt + 1, p[i].x, p[i].y);
}
if(p[i].k == 2) {
s[p[i].x].erase(p[i].y);
remove(1, 1, cnt + 1, p[i].x, p[i].y);
}
if(p[i].k == 3) {
ans_x = ans_y = -1;
query(1, 1, cnt + 1, p[i].x+1, cnt + 1, p[i].y);
if(ans_x == -1) printf("-1\n");
else printf("%d %d\n", x[ans_x], ans_y);
}
}
}
int main(void)
{
int _ = 0;
while(scanf("%d", &n), n != 0) {
init();
read();
if(_) printf("\n");
printf("Case %d:\n", ++_);
work();
}
return 0;
}