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. codeforces 880E. Maximum Subsequence(折半搜索+双指针)

    E. Maximum Subsequence time limit per test 1 second memory limit per test 256 megabytes input standa ...

  2. JavaScript中this的使用方法总结

    JavaScript中this的使用方法总结 在JavaScript中,this的使用分为四种场景,具体请参考阮一峰老师关于this的讲解 第一种情况是纯函数使用 var x =1 ; functio ...

  3. java多线程模拟龟兔赛跑

    让乌龟和兔子在同一个赛道从1开始跑到100,看看谁更快. public class Racer implements Runnable{ private static String winner;// ...

  4. Luogu P2920 时间管理【二分答案】

    二分答案水题. (像我这么蒻的人都能十几分钟A掉) https://www.luogu.org/problemnew/show/P2920 开始时间一定在从0到min(t[i]-s[i])的一段区间上 ...

  5. thunderbird 登录网易邮箱

    登录密码不是自己的密码,而是在网易邮箱中设置的客户端授权ma,自己先进入邮箱进行设置即可

  6. 使用pabot并行执行robotframework用例

    主要观点:使用pabot并行运行robotframework,可以解决:robotframework执行案例时间长的问题 解决执行案例时间长的方案: 目的: 缩短案例的运行时间 两种方法: 将大的项目 ...

  7. 51nod 1100 斜率最大

    可以用三个点简单证明斜率最大的直线两个点! #include <bits/stdc++.h> #define MAXN 10010 using namespace std; struct ...

  8. WIN7中Beyond Compare报错误“应用程序发生错误” 无法启动

    BCompare在WIN7中打开提示"应用程序发生错误"的解决办法: WIN7下寻找:把C:\用户\[用户名]\AppData\Roaming\Scooter Software\B ...

  9. 使用Maven将dubbox安装进资源仓库

    dubbox网址:https://github.com/dangdangdotcom/dubbox dobbox版本:https://github.com/dangdangdotcom/dubbox/ ...

  10. Heart Beat

    实现关键: 1.纯css实现心形图(如果使用图片则无需) html代码: <!DOCTYPE html> <html> <head> <meta charse ...