time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Pete and Bob invented a new interesting game. Bob takes a sheet of paper and locates a Cartesian coordinate system on it as follows: point (0, 0) is located in the bottom-left corner, Ox axis is directed right, Oy axis is directed up. Pete gives Bob requests of three types:

  • add x y — on the sheet of paper Bob marks a point with coordinates (x, y). For each request of this type it's guaranteed that point (x, y) is not yet marked on Bob's sheet at the time of the request.
  • remove x y — on the sheet of paper Bob erases the previously marked point with coordinates (x, y). For each request of this type it's guaranteed that point (x, y) is already marked on Bob's sheet at the time of the request.
  • find x y — on the sheet of paper Bob finds all the marked points, lying strictly above and strictly to the right of point (x, y). Among these points Bob chooses the leftmost one, if it is not unique, he chooses the bottommost one, and gives its coordinates to Pete.

Bob managed to answer the requests, when they were 10, 100 or 1000, but when their amount grew up to 2·105, Bob failed to cope. Now he needs a program that will answer all Pete's requests. Help Bob, please!

Input

The first input line contains number n (1 ≤ n ≤ 2·105) — amount of requests. Then there follow n lines — descriptions of the requests. add x y describes the request to add a point, remove x y — the request to erase a point, find x y — the request to find the bottom-left point. All the coordinates in the input file are non-negative and don't exceed 109.

Output

For each request of type find x y output in a separate line the answer to it — coordinates of the bottommost among the leftmost marked points, lying strictly above and to the right of point (x, y). If there are no points strictly above and to the right of point (x, y), output -1.

Sample test(s)
Input
7
add 1 1
add 3 4
find 0 0
remove 1 1
find 0 0
add 1 1
find 0 0
Output
1 1
3 4
1 1
Input
13
add 5 5
add 5 6
add 5 7
add 6 5
add 6 6
add 6 7
add 7 5
add 7 6
add 7 7
find 6 6
remove 7 7
find 6 6
find 4 4
Output
7 7
-1
5 5
 #include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <iomanip>
#include <set>
#include <map>
#include <vector>
#include <queue>
#define llt long long int
#define ml(x, y) ((x + y) >> 1)
#define mr(x, y) (((x + y) >> 1) + 1)
#define pl(p) (p << 1)
#define pr(p) ((p << 1) | 1)
#define N 200005
using namespace std;
map<int, int> mp;//离散化使用
vector<int> tx;//额外记录x
int segtree[N << ];//维护该区间的最大值,查询用
set<int> ty[N];//存对应x的所有y值
struct node
{
int x, y;
char op[];
}point[N];
void build(int l, int r, int p)//初始化线段树
{
segtree[p] = ;
if (l < r)
{
build(l, ml(l, r), pl(p));
build(mr(l, r), r, pr(p));
}
else
ty[l].clear();
}
void update(int l, int r, int p, int x, int y, int tag)
{
if (l == r)
{
if (tag)//add操作
{
ty[l].insert(y);
if (segtree[p] < y)
segtree[p] = y;
}
else
{
ty[l].erase(y);
segtree[p] = ty[l].empty() ? : *(--ty[l].end());
}
return;
}
if (ml(l, r) >= x)
update(l, ml(l, r), pl(p), x, y, tag);
else
update(mr(l, r), r, pr(p), x, y, tag);
segtree[p] = max(segtree[pl(p)], segtree[pr(p)]);
}
pair<int, int> query(int l, int r, int p, int x, int y)
{
if (r < x || segtree[p] < y)//未找到
return make_pair(-, -);
if (r == l)//找到了最合适的
return make_pair(r, *ty[r].lower_bound(y));
pair<int, int> ans = query(l, ml(l, r), pl(p), x, y);//先往左找
if (ans.first != -)//找到了
return ans;
return query(mr(l, r), r, pr(p), x, y);//未找到,右边找
}
int main()
{
int n, i, size;
while (~scanf("%d", &n))
{
tx.clear();
mp.clear();
for (i = ; i < n; i++)
{
scanf("%s%d%d", point[i].op, &point[i].x, &point[i].y);
tx.push_back(point[i].x);
}
sort(tx.begin(), tx.end());//排序
tx.erase(unique(tx.begin(), tx.end()), tx.end());//除去相同的元素
size = tx.size() - ;
build(, size, );
for (i = ; i <= size; i++)//进行离散化
mp[tx[i]] = i;
for (i = ; i < n; i++)
{
if (point[i].op[] == 'f')
{
pair<int, int> ans = query(, size, , mp[point[i].x] + , point[i].y + );
if (ans.first >= )
printf("%d %d\n", tx[ans.first], ans.second);
else
puts("-1");
continue;
}
update(, size, , mp[point[i].x], point[i].y, point[i].op[] == 'a'? : );
}
}
return ;
}

Codeforces Beta Round #19D(Points)线段树的更多相关文章

  1. CodeForces 19D Points (线段树+set)

    D. Points time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...

  2. CF 19D - Points 线段树套平衡树

    题目在这: 给出三种操作: 1.增加点(x,y) 2.删除点(x,y) 3.询问在点(x,y)右上方的点,如果有相同,输出最左边的,如果还有相同,输出最低的那个点 分析: 线段树套平衡树. 我们先离散 ...

  3. Codeforces 295E Yaroslav and Points 线段树

    Yaroslav and Points 明明区间合并一下就好的东西, 为什么我会写得这么麻烦的方法啊啊啊. #include<bits/stdc++.h> #define LL long ...

  4. Palisection(Codeforces Beta Round #17E+回文树)

    题目链接 传送门 题意 给你一个串串,问你有多少对回文串相交. 思路 由于正着做不太好算答案,那么我们考虑用总的回文对数减去不相交的回文对数. 而不相交的回文对数可以通过计算以\(i\)为右端点的回文 ...

  5. Codeforces Beta Round #75 (Div. 2 Only)

    Codeforces Beta Round #75 (Div. 2 Only) http://codeforces.com/contest/92 A #include<iostream> ...

  6. Codeforces Beta Round #35 (Div. 2)

    Codeforces Beta Round #35 (Div. 2) http://codeforces.com/contest/35 A 这场的输入输出是到文件中的,不是标准的输入输出...没注意看 ...

  7. Codeforces Beta Round #12 (Div 2 Only)

    Codeforces Beta Round #12 (Div 2 Only) http://codeforces.com/contest/12 A 水题 #include<bits/stdc++ ...

  8. Codeforces Beta Round #80 (Div. 2 Only)【ABCD】

    Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...

  9. Codeforces Beta Round #79 (Div. 2 Only)

    Codeforces Beta Round #79 (Div. 2 Only) http://codeforces.com/contest/102 A #include<bits/stdc++. ...

随机推荐

  1. python网络爬虫之三re正则表达式模块

    """ re正则表达式,正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的 一些特定字符,及这些特定字符的组合,组成一个"规则字符串",然后用 ...

  2. [POI2008]激光发射器SZK

    Description 多边形相邻边垂直,边长为整数,边平行坐标轴.要在多边形的点上放一些激光发射器和接收器.满足下列要求: 1发射器和接收器不能放置在同一点: 2发射器发出激光可以沿壁反射,最终到达 ...

  3. Floyd+限制路径步数(快速幂优化)

    POJ 3613 Cow Relays 最短路可以采用Floyd来计算,但是限制时间在1s内,估计直接写会超时,所以要用到快速幂来优化. 快速幂的思想是:xy=xy/2∗2" role=&q ...

  4. String Mark Codeforces - 895D

    一看好像会做的样子,就去做了一下,结果 猝不及防地T掉了 赶紧查了一下,没有死循环,复杂度也是对的,无果,于是翻了题解 题解没看懂,但是找到了标程,然后发现我被卡常了... 而且好像当时还过了前10个 ...

  5. 关于Swing中JFrame等顶级容器的层次还有设置背景的方式

    资料来自:http://blog.csdn.net/qq_32006373/article/details/49659129 http://yuncode.net/code/c_5196327caac ...

  6. win7 系统 右键很慢

    一般都是显卡驱动造成的, 在桌面按右键反应慢,通常都是显卡驱动程序惹的祸,最最简单有效的办法就是:开始--运行--. 运行regsvr32 /u igfxpph.dll

  7. oracle数据库常用的99条查询语句

    1. select * from emp; 2. select empno, ename, job from emp; 3. select empno 编号, ename 姓名, job 工作 fro ...

  8. mybatis的mapper.xml文件细节

  9. LN : leetcode 70 Climbing Stairs

    lc 70 Climbing Stairs 70 Climbing Stairs You are climbing a stair case. It takes n steps to reach to ...

  10. Android学习笔记(八) CheckBox和RadioGroup

    一.CheckBox 1.CheckBox的常用方法: boolean isChecked() :返回当前CheckBox的选中状态 void setChecked(boolean isChecked ...