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. 转载ajax

    写在前面的话: 用了很久的Asp.Net Ajax,也看了段时间的jquery中ajax的应用,但到头来,居然想不起xmlHttpRequest的该如何使用了. 以前记的也不怎么清楚,这次就重新完整的 ...

  2. Android消息机制之Handler

    Android为什么要提供Handler Android建议我们不要在UI线程中执行耗时操作,因为这很容易导致ANR异常(在Android源码中我们可以看到,UI如果对用户的操作超过5秒无响应,就会报 ...

  3. string s = HttpContext.Current.Server.MapPath("");

    string s = HttpContext.Current.Server.MapPath(""); 获取当前文件夹路径 而后用相对路径读取图片

  4. shell学习-读取输入

    功能:读取输入,打印:如果长度小于MINLEN,那么输出空格. #!/bin/bash # paragraph-space.sh # Insert a blank line between parag ...

  5. 关于Python的self指向性

    Python的self是指向类的实例化对像,而不是类本身,每次调用类的实例化即self指向此实例化对像,如下代码: class Person: def __init__(self,name): sel ...

  6. ORA-20000: ORU-10027: buffer overflow, limit of 10000 bytes

        要用dbms_output.put_line来输出语句,遇到以下错误: ERROR 位于第 1 行: ORA-20000: ORU-10027: buffer overflow, limit ...

  7. 帝国cms7.2灵动标签万能教程

    学完本文,就完全能掌握帝国模板开发制作啦!这里只介绍sql语句调用方法(方便,快捷!) 灵动标签语法: [e:loop={,24,0}] 模板内容 [/e:loop] 详细解释:黄色部分:条件语句,即 ...

  8. JS中的RegExp对象常用属性和方法

    JavaScript提供了一个RegExp对象来完成有关正则表达式的操作和功能,每一条正则表达式模式对应一个RegExp实例.有两种方式可以创建RegExp对象的实例. 使用RegExp的显式构造函数 ...

  9. 导出Ext.grid.Panel到excel

    1.客户端定义,基本的想法是form提交表格头定义,数据,以json方式传输 Ext.grid.Panel.addMembers({ exportExcel:function(options){ if ...

  10. zookeeper leader作用

    一个zookeeper 集群 只有一个leader: 类似master/slave模式 客户端提交请求之后,先发送到leader,leader作为接收者,广播到每个server 在folloer上创建 ...