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. HDU 3549 Flow Problem(最大流)

    HDU 3549 Flow Problem(最大流) Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...

  2. Java I/O 文件加锁,压缩

    文件加锁: 文件加锁机制允许我们同步访问某个作为共享资源的文件. public class Test { public static void main(String[] args) throws I ...

  3. iOS - Swift NSNumber 数字

    前言 public class NSNumber : NSValue public class NSDecimalNumber : NSNumber NSNumber 可以被赋值为各种数值类型.我们可 ...

  4. win10系统更新补丁时进度条一直卡在0%不动的解决方案

    为了能够让win10系统更加安全稳定,很多用户都会时不时为自己的电脑安装补丁.不过,部分用户在为win10系统更新补丁时,却会遇到进度条一直卡在0%不动的问题.这该怎么办呢?下面,小编就告诉大家解决该 ...

  5. Git与Repo入门(转载)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAykAAADuCAIAAACyDd+sAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4Xu ...

  6. mysql 大数据量求平均值

    需求是:对于一个设备,求一天内每个小时的平均值,一个月内每天的平均值,更通用的需求是,从起始时间到结束时间,每隔一段时间,求一个平均值.目前的解决策略是:在存储过程中进行处理,从起始时间到结束时间,切 ...

  7. Javascript设计模式之创建构造函数和方法

    构造函数和方法 var Book = function (isbn,title,author) { this.setIsbn(isbn); this.setTitle(title); this.set ...

  8. wireshark使用教程

    Wireshark: https://www.wireshark.org/ 安装: apt-get install wireshark 教程: http://blog.csdn.net/leichel ...

  9. hdfs namenode -initializeSharedEdits 和 hdfs namenode -bootstrapStandby

    hdfs namenode -initializeSharedEdits 将所有journal node的元文件的VERSION文件的参数修改成与namenode的元数据相同 hdfs namenod ...

  10. Eclipse安装SVN插件总结

    1.下载最新的Eclipse,我的版本是3.7.2 indigo(Eclipse IDE for Java EE Developers)版    如果没有安装的请到这里下载安装:http://ecli ...