program bzoj3196;
const inf=;
maxn=;
maxm=; var n,m,time,temp:longint;
root,a:array [..maxn] of longint;
left,right,rnd,v,s,w:array [..maxm] of longint; procedure update(now:longint);
begin
s[now]:=s[left[now]]+s[right[now]]+w[now];
end; procedure rightturn(var now:longint);
var t:longint;
begin
t:=left[now];
left[now]:=right[t];
right[t]:=now;
s[t]:=s[now];
update(now);
now:=t;
end; procedure leftturn(var now:longint);
var t:longint;
begin
t:=right[now];
right[now]:=left[t];
left[t]:=now;
s[t]:=s[now];
update(now);
now:=t;
end; procedure insert(var now:longint; num:longint);
begin
if now= then
begin
inc(time);
now:=time;
w[now]:=;
s[now]:=w[now];
v[now]:=num;
rnd[now]:=random(inf);
exit;
end;
inc(s[now]);
if num=v[now] then inc(w[now])
else if num<v[now] then
begin
insert(left[now],num);
if rnd[left[now]]<rnd[now] then rightturn(now);
end
else
begin
insert(right[now],num);
if rnd[right[now]]<rnd[now] then leftturn(now);
end;
end; procedure del(var now:longint; num:longint);
begin
if v[now]=num then
begin
if w[now]> then
begin
dec(w[now]);
dec(s[now]);
exit;
end;
if left[now]*right[now]= then
now:=left[now]+right[now]
else
if rnd[left[now]]<rnd[right[now]] then
begin
rightturn(now);
del(now,num);
end
else
begin
leftturn(now);
del(now,num);
end
end
else
if num<v[now] then
begin
del(left[now],num);
dec(s[now]);
end
else
begin
del(right[now],num);
dec(s[now]);
end;
end; procedure build(now,l,r,x,num:longint);
var mid:longint;
begin
insert(root[now],num);
if l=r then exit;
mid:=(l+r) shr ;
if x<=mid then build(now<<,l,mid,x,num)
else build(now<< or ,mid+,r,x,num);
end; procedure ask_rank(now,num:longint);
begin
if now= then exit;
if num=v[now] then
begin
inc(temp,s[left[now]]);
exit;
end
else
if num<v[now] then
ask_rank(left[now],num)
else
begin
inc(temp,s[left[now]]+w[now]);
ask_rank(right[now],num);
end;
end; procedure get_rank(now,l,r,x,y,num:longint);
var mid:longint;
begin
mid:=(l+r) shr ;
if (l=x) and (r=y) then
begin
ask_rank(root[now],num);
exit;
end;
if mid>=y then get_rank(now<<,l,mid,x,y,num)
else if mid<x then get_rank(now<< or ,mid+,r,x,y,num)
else
begin
get_rank(now<<,l,mid,x,mid,num);
get_rank(now<< or ,mid+,r,mid+,y,num);
end;
end; procedure get_index(x,y,z:longint);
var l,r,ans,mid:longint;
begin
l:=; r:=inf;
while l<=r do
begin
mid:=(l+r) shr ;
temp:=;
get_rank(,,n,x,y,mid);
if temp<=z then
begin
l:=mid+;
ans:=mid;
end
else
r:=mid-;
end;
writeln(ans);
end; procedure change(now,l,r,x,num,y:longint);
var mid:longint;
begin
del(root[now],y);
insert(root[now],num);
if l=r then exit;
mid:=(l+r) shr ;
if x<=mid then change(now<<,l,mid,x,num,y)
else change(now<< or ,mid+,r,x,num,y);
end; function max(x,y:longint):longint;
begin
if x>y then exit(x)
else exit(y);
end; function min(x,y:longint):longint;
begin
if x<y then exit(x)
else exit(y);
end; procedure before(now,num:longint);
begin
if now= then exit;
if v[now]<num then
begin
temp:=max(v[now],temp);
before(right[now],num);
end
else
before(left[now],num);
end; procedure after(now,num:longint);
begin
if now= then exit;
if v[now]>num then
begin
temp:=min(v[now],temp);
after(left[now],num);
end
else
after(right[now],num);
end; procedure ask_after(now,l,r,x,y,num:longint);
var mid:longint;
begin
if (l=x) and (r=y) then
begin
after(root[now],num);
exit;
end;
mid:=(l+r) shr ;
if mid>=y then ask_after(now<<,l,mid,x,y,num)
else if mid<x then ask_after(now<< or ,mid+,r,x,y,num)
else
begin
ask_after(now<<,l,mid,x,mid,num);
ask_after(now<< or ,mid+,r,mid+,y,num);
end;
end; procedure ask_before(now,l,r,x,y,num:longint);
var mid:longint;
begin
if (l=x) and (r=y) then
begin
before(root[now],num);
exit;
end;
mid:=(l+r) shr ;
if mid>=y then ask_before(now<<,l,mid,x,y,num)
else if mid<x then ask_before(now<< or ,mid+,r,x,y,num)
else
begin
ask_before(now<<,l,mid,x,mid,num);
ask_before(now<< or ,mid+,r,mid+,y,num);
end;
end; procedure main;
var i,x,y,now,f:longint;
begin
read(n,m);
for i:= to n do read(a[i]);
for i:= to n do build(,,n,i,a[i]);
for i:= to m do
begin
read(f);
case f of
:
begin
read(x,y,now);
temp:=;
get_rank(,,n,x,y,now);
writeln(temp);
end;
:
begin
read(x,y,now);
get_index(x,y,now);
end;
:
begin
read(x,y);
change(,,n,x,y,a[x]);
a[x]:=y;
end;
:
begin
read(x,y,now);
temp:=;
ask_before(,,n,x,y,now);
writeln(temp);
end;
:
begin
read(x,y,now);
temp:=inf;
ask_after(,,n,x,y,now);
writeln(temp);
end;
end;
end;
end; begin
main;
end.

BZOJ 3196的更多相关文章

  1. [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】

    题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...

  2. bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1807  Solved: 772[Submit][Stat ...

  3. BZOJ 3196 二逼平衡树

    Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的 ...

  4. BZOJ 3196: Tyvj 1730 二逼平衡树( 树套树 )

    这道题做法应该很多吧.... 我用了线段树套treap.... -------------------------------------------------------------------- ...

  5. bzoj 3196 && luogu 3380 JoyOI 1730 二逼平衡树 (线段树套Treap)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3196 题面; 3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Se ...

  6. BZOJ 3196 Tyvj 1730 二逼平衡树 树套树 线段树 treap

    http://www.lydsy.com/JudgeOnline/problem.php?id=3196 http://hzwer.com/2734.html 线段树套treap,似乎splay也可以 ...

  7. bzoj 3196/ Tyvj 1730 二逼平衡树 (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description ...

  8. 【42.38%】【BZOJ 3196】二逼平衡树

    Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1363 Solved: 579 [Submit][Status][Discuss] Descripti ...

  9. BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树

    [题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...

  10. bzoj 3196: Tyvj 1730 二逼平衡树

    #include<cstdio> #include<ctime> #include<cstdlib> #include<iostream> #defin ...

随机推荐

  1. 一步一步学c#(六):数组

    数组 简单数组 如果需要使用同一个类型的多个对象,就可以使用数组.数组是一种数据结构,它可以包含同一类型的多个元素. 数组声明:int[] myArray 使用new运算符,指定数组中元素的类型和数量 ...

  2. javascript函数作用域链之词法作用域

    在开发语言中常见的作用域规则有  块级作用域和词法作用域 作用域 顾名思义就是起作用的区域  定义一变量后 ,可以在此范围作用的区域 一.块级作用域就是用一个块结构分割变量的访问区域  块即{ } 代 ...

  3. BZOJ 2208: [Jsoi2010]连通数( DFS )

    n只有2000,直接DFS就可以过了... -------------------------------------------------------------------------- #in ...

  4. Java学习之equals和hashcode的关系

    两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 答:不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(has ...

  5. PHP调试工具 《Kint》

    Kint使用,简单介绍 是一个简单又强大的PHP调试工具. 1.kint 是什么? kint是用绝对易人识辨的方式展示PHP调试的数据. 换句话说,它可以取var_dump(),debug_blick ...

  6. Linux Mysql Client 查询中文乱码

    1.mysql client 端设置编码为utf8 set character_set_results=utf8; 2.连接linux的客户端的编码也要设置为utf8(比如xshell,putty等)

  7. 5.6.3.8 fromCharCode()方法

    String构造函数本身还有一个静态方法:fromCharCode().这个方法的任务是接收一或多个字符编码,然后将它们转换成一个字符.从本质上来看,这个方法与实例方法charCodeAt()执行的是 ...

  8. javascript 作用域链

    最近想整理一下js执行代码的一些知识,如果有出错的地方还请指正. 执行环境(Execution Context) 所有的javascript代码都是在一个执行环境中被执行的.它只是一种机制,用来完成运 ...

  9. CSS3 模拟笑脸

    参考 http://www.html5tricks.com/demo/html5-css3-smile-face/index.html 它还做了舌头... 一开始我都是用JS实现的动画  当然了  眼 ...

  10. Firefox 备份

    参考http://mozilla.com.cn/post/32327/ 火狐的地址栏中输入about:support点击“打开所在文件夹”按钮,会弹出一个资源管理器,并且定位到你当前的Profile文 ...