CRB and Queries

Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 231    Accepted Submission(s): 41

Problem Description
There are N boys in CodeLand.
Boy i has his coding skill Ai.
CRB wants to know who has the suitable coding skill.
So you should treat the following two types of queries.
Query 1: 1 l v
The coding skill of Boy l has changed to v.
Query 2: 2 l r k
This is a report query which asks the k-th smallest value of coding skill between Boy l and Boy r(both inclusive).
 
Input
There are multiple test cases. 
The first line contains a single integer N.
Next line contains N space separated integers A1, A2, …, AN, where Ai denotes initial coding skill of Boy i.
Next line contains a single integer Q representing the number of queries.
Next Q lines contain queries which can be any of the two types.
1 ≤ N, Q ≤ 105
1 ≤ Ai, v ≤ 109
1 ≤ l ≤ r ≤ N
1 ≤ k ≤ r – l + 1

 
Output
For each query of type 2, output a single integer corresponding to the answer in a single line.
 
Sample Input
5
1 2 3 4 5
3
2 2 4 2
1 3 6
2 2 4 2
 
Sample Output
3
4
 
Author
KUT(DPRK)
 
Source
 
//动态空间第k大
#include <algorithm>
#include <cstdio>
#include <utility>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std; #define X first
#define Y second const int MX = ;
const int INF = ;
struct Node;
typedef pair <Node*, Node*> Pair;
Node *null; struct Node {
int val, size;
Node *left, *right; Node (int val, int size, Node *left, Node *right) :
val(val), size(size), left(left), right(right) {} Node *Update() {
size = left->size + + right->size;
return this;
} int askLess(const int &x) {
if (this == null) return ;
if (val < x) return left->size + + right->askLess(x);
else return left->askLess(x);
}
Pair Split(int n, int type) {
if (this == null)
return make_pair(null, null); if (type == && val == n) {
return make_pair(left, right);
} if (!(val < n)) {
Pair ret = left->Split(n, type);
left = ret.Y;
return make_pair(ret.X, this->Update());
} Pair ret = right->Split(n, type);
right = ret.X;
return make_pair(this->Update(), ret.Y);
}
}; struct BST {
Node *root; inline int ran() {
static int x = ;
x += (x << ) + ;
return x & ;
}
Node *Merge(Node *a, Node *b) {
if (a == null) return b;
if (b == null) return a; if (ran() % (a->size + b->size) < a->size) {
a->right = Merge(a->right, b);
return a->Update();
} b->left = Merge(a, b->left);
return b->Update();
} void add(int b) {
Pair ret = root->Split(b, );
root = Merge(ret.X, Merge(new Node(b, , null, null), ret.Y));
}
void del(int b) {
Pair ret = root->Split(b, );
root = Merge(ret.X, ret.Y);
}
int getLess(int b) {
return root->askLess(b);
} } tr[MX]; struct Query {
int t, l, r, k; void in() {
scanf("%d", &t);
if (t == ) scanf("%d%d", &l, &k);
else scanf("%d%d%d", &l, &r, &k);
} } q[MX]; int a[MX];
int p[MX], pn;
int L; void add(int p, int v) {
for (p++; p <= pn; p += p & -p) {
tr[p].add(v);
}
}
void del(int p, int v) {
for (p++; p <= pn; p += p & -p) {
tr[p].del(v);
}
} int calc(int l, int r, int k) {
int cur = ;
for (int i = L; i; i /= ) {
int u = cur + i;
if (u > pn) continue; int cnt = tr[u].getLess(r + ) - tr[u].getLess(l);
if (cnt >= k) continue;
cur = u, k -= cnt;
}
return cur + ;
} int main() {
int n, Q;
int i;
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
while(scanf("%d", &n)!=EOF){ for (i = ; i <= n; i++) {
scanf("%d", a + i);
p[pn++] = a[i];
} scanf("%d", &Q);
for (i = ; i <= Q; i++) {
q[i].in();
if (q[i].t == ) p[pn++] = q[i].k;
} sort(p, p + pn);
pn = unique(p, p + pn) - p;
for (L = ; L <= pn; L *= );
L /= ; null = new Node(, , NULL, NULL);
for (i = ; i <= pn; i++)
tr[i].root = null; for (i = ; i <= n; i++) {
a[i] = lower_bound(p, p + pn, a[i]) - p;
add(a[i], i);
} for (i = ; i <= Q; i++)
if (q[i].t == ) q[i].k = lower_bound(p, p + pn, q[i].k) - p; for (i = ; i <= Q; i++) {
if (q[i].t == ) {
int u = q[i].l;
del(a[u], u);
a[u] = q[i].k;
add(a[u], u); } else {
int u = calc(q[i].l, q[i].r, q[i].k);
printf("%d\n", p[u - ]);
}
}
}
return ;
}

hdu5412(动态区间第k大)的更多相关文章

  1. ZOJ 1112 Dynamic Rankings【动态区间第K大,整体二分】

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1112 题意: 求动态区间第K大. 分析: 把修改操作看成删除与增加 ...

  2. ZOJ 2112 Dynamic Rankings(动态区间第 k 大+块状链表)

    题目大意 给定一个数列,编号从 1 到 n,现在有 m 个操作,操作分两类: 1. 修改数列中某个位置的数的值为 val 2. 询问 [L, R] 这个区间中第 k 大的是多少 n<=50,00 ...

  3. ZOJ2112--Dynamic Rankings (动态区间第k大)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  4. 整体二分求动态区间第k大

    比树状数组套主席树不知道高到哪里去了,solve(l,r,L,R)就是对于L,R的操作区间的答案都在l,r区间里,然后递归下去 复杂度O(nlognlogn),每个操作会执行logn次就是o(nlog ...

  5. Dynamic_Rankings(动态区间第k大)

    ZOJ - 2112 \[ \ \] (那些说这道题是树状数组套主席树的人一定对主席树有误解!) 这里我们用树状数组套线段树来解决来写 首先 , 我们需要有n棵线段树(不是\(n^2\)空间,别慌) ...

  6. 整体二分(模板二)动态区间第K大

    这才是更一般的二分写法--HDU5412 #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>// ...

  7. 动态区间第K大

    整体二分. 主要需要注意的一点是,对于每个删除操作,若删除操作被算入贡献,则最开始的插入操作也一定会被算入,所以不必担心删除删错. #include<cstdio> #include< ...

  8. 静态区间第k大(主席树)

    POJ 2104为例(主席树入门题) 思想: 可持久化线段树,也叫作函数式线段树,也叫主席树(高大上). 可持久化数据结构(Persistent data structure):利用函数式编程的思想使 ...

  9. 【ZOJ2112】【整体二分+树状数组】带修改区间第k大

    The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...

随机推荐

  1. OpenCV installation on Linux

    Getting the Cutting-edge OpenCV from the Git Repository Launch Git client and clone OpenCV repositor ...

  2. MySQl的几个配置项

    对对于MySQL的日志功能,我们可以完全自己控制到底写还是不写.一般来说,binlog我们一般会开启,而对于慢查询我们一般会在开发的时候调试和观 察SQL语句的执行速度.但今天发现一个问题.在使用sh ...

  3. POJ3009 Curling

    题目链接:http://poj.org/problem?id=3009 题意:从2出发,要到达3, 0可以通过,碰到1要停止,并且1处要变成0, 并且从起点开始沿着一个方向要一直前进,直至碰到1(或者 ...

  4. C#正则表达式编程(一):C#中有关正则的类

    正则表达式是一门灵活性非常强的语言,匹配同样的字符串可能在不同的开发人员那里会得到不同的结果,在平常的时候也是用的时候看看相关资料,不用的时候就丢在脑后了,尽管在处理大部分情况下都能迅速处理,但是处理 ...

  5. JS完成改变新闻字体大中小的显示

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  6. hdu3124Arbiter(最小圆距离-扫描线)

    链接 详解http://blog.sina.com.cn/s/blog_6e7b12310100qnex.html #include <iostream> #include<cstd ...

  7. JavaWeb学习总结(十三)--数据库连接池

    一.数据库连接池的概念 用池来管理Connection,这可以重复使用Connection.有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象.当使用完Co ...

  8. caffe中的filler.hpp源码的作用:

    filler.hpp文件:(它应该没有对应的.cpp文件,一切实现都是在头文件中定义的,可能是因为filler只分在网络初始化时用到那么一次吧) 1,首先定义了基类:Filler,它包括:一个纯虚函数 ...

  9. android实现系统电话通话过程中自动感应黑屏

    package com.developmenttools.customui.activity; import java.util.HashSet;import java.util.Set; impor ...

  10. Linq To Sql 语法 子查询 & In & Join

    子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 =from cin ctx.Customers                    where                  ...