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. vmware虚拟机上linux操作系统进行tty1~tty6切换方法和具体步骤

    vmware虚拟机上linux操作系统怎样进行tty1~tty6切换? 现象: Linux的终端机(文字)界面与图形界面间的切换热键为: 进入终端机也就是字符界面(tty1-tty6):[Ctrl] ...

  2. 远程登录阿里云上的MySQL

    近期对云和server之类的感兴趣,想要将自己的数据什么的保存到远端server.研究了阿里云和百度云.今天算是有点进步吧. 我在阿里云上申请了个免费的云server(ECS),非常可惜仅仅能用5天. ...

  3. 自己动手写 ASP.NET MVC 分页 part1

    学习编程也有一年半载了,从来没有自己动手写过东西,都是利用搜索软件找代码,最近偶发感慨,难道真的继续做码农??? 突发奇想是不是该自己动手写点东西,可是算法.逻辑思维都太弱了,只能copy网上的代码, ...

  4. git切换远程

    已经开发一段时日,公司突然提出要换git仓库 查看目前所有的分支 $git branch -va 添加新的远程仓库 $ git remot add [name] [url] 查看下目前配置 $ git ...

  5. 利用python进行数据分析之数据规整化

    数据分析和建模大部分时间都用在数据准备上,数据的准备过程包括:加载,清理,转换与重塑. 合并数据集 pandas对象中的数据可以通过一些内置方法来进行合并: pandas.merge可根据一个或多个键 ...

  6. Linux下使用ps命令来查看Oracle相关的进程

    Linux下可以使用ps命令来查看Oracle相关的进程 Oracle Listener 这个命令会列出Oracle Net Listener的进程 [oracle@ www.linuxidc.com ...

  7. ajax Session失效如何跳转到登录页面

    在Struts应用中,我们发出的请求都会经过 相应的拦截器进行相关处理,一般都会有一个用户登录拦截(Session失效拦截):一般请求的话,如果Session失效时,我们会跳到登录页面,可是如果我们采 ...

  8. jQuery事件函数bind,live,delegate的区别

    DOM树 首先,可视化一个HMTL文档的DOM树是很有帮助的.一个简单的HTML页面看起来就像是这个样子: 事件冒泡(又称事件传播) 当我们点击一个链接时,其触发了链接元素的单击事件,该事件则引发任何 ...

  9. Protel 99SE PCB 打印技巧

    1. 打开 Protel99SE PCB 设计文档.从菜单File 下单击Print/Preview 打印预览菜单.出现PCB 打印预览介面. 2.从File 下单击 Setup Printer 设置 ...

  10. AnyEvent::HTTP 实现异步请求

    异步http: jrhmpt01:/root/async# cat a1.pl use LWP::UserAgent; use utf8; use DBI; use POSIX; use HTTP:: ...