#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<iostream>
#define M 3000009
using namespace std;
struct shu
{
int l,r,sum1,zhi,dui,sum2;
}a[M];
int n,root[M],size,ans,b[M],m;
void you(int &a1)
{
int t=a[a1].l;
a[a1].l=a[t].r;
a[t].r=a1;
a[t].sum1=a[a1].sum1;
a[a1].sum1=a[a[a1].l].sum1+a[a[a1].r].sum1+a[a1].sum2;
a1=t;
return;
}
void zuo(int &a1)
{
int t=a[a1].r;
a[a1].r=a[t].l;
a[t].l=a1;
a[t].sum1=a[a1].sum1;
a[a1].sum1=a[a[a1].l].sum1+a[a[a1].r].sum1+a[a1].sum2;
a1=t;
return;
}
void cha(int &a1,int a2)
{
if(!a1)
{
size++;
a1=size;
a[a1].sum1=;
a[a1].sum2=;
a[a1].zhi=a2;
a[a1].dui=rand();
return;
}
a[a1].sum1++;
if(a[a1].zhi==a2)
{
a[a1].sum2++;
return;
}
if(a2<a[a1].zhi)
{
cha(a[a1].l,a2);
if(a[a[a1].l].dui<a[a1].dui)
you(a1);
}
else
{
cha(a[a1].r,a2);
if(a[a[a1].r].dui<a[a1].dui)
zuo(a1);
}
}
void shan(int &a1,int a2)
{
if(a1==)
return;
if(a[a1].zhi==a2)
{
if(a[a1].sum2>)
{
a[a1].sum2--;
a[a1].sum1--;
}
else if(a[a1].l*a[a1].r==)
a1=a[a1].l+a[a1].r;
else if(a[a[a1].l].dui<a[a[a1].r].dui)
{
you(a1);
shan(a1,a2);
}
else
{
zuo(a1);
shan(a1,a2);
}
return;
}
a[a1].sum1--;
if(a[a1].zhi<a2)
shan(a[a1].r,a2);
else
shan(a[a1].l,a2);
return;
}
int cha1(int a1,int a2)
{
if(!a1)
return ;
if(a[a1].zhi==a2)
return a[a[a1].l].sum1;
if(a[a1].zhi>a2)
return cha1(a[a1].l,a2);
return a[a[a1].l].sum1+a[a1].sum2+cha1(a[a1].r,a2);
}
void qian(int a1,int a2)
{
if(!a1)
return;
if(a[a1].zhi<a2)
{
ans=max(a[a1].zhi,ans);
qian(a[a1].r,a2);
}
else
qian(a[a1].l,a2);
return;
}
void hou(int a1,int a2)
{
if(!a1)
return;
if(a[a1].zhi>a2)
{
ans=min(a[a1].zhi,ans);
hou(a[a1].l,a2);
}
else
hou(a[a1].r,a2);
return;
}
void build(int a1,int l,int r,int x,int v)
{
cha(root[a1],v);
if(l==r)
return;
int mid=(l+r)>>;
if(x<=mid)
build(a1*,l,mid,x,v);
else
build(a1*+,mid+,r,x,v);
return;
}
void xicha1(int a1,int l,int r,int l1,int r1,int x)
{
if(l1<=l&&r1>=r)
{
ans+=cha1(root[a1],x);
return;
}
int mid=(l+r)>>;
if(l1<=mid)
xicha1(a1*,l,mid,l1,r1,x);
if(r1>mid)
xicha1(a1*+,mid+,r,l1,r1,x);
return;
}
void xicha2(int l1,int r1,int x)
{
int l2=,r2=,q=;
for(;l2<=r2;)
{
int mid=(l2+r2)>>;
ans=;
xicha1(,,n,l1,r1,mid);
if(ans<=x)
{
q=mid;
l2=mid+;
}
else
r2=mid-;
}
printf("%d\n",q);
}
void change(int a1,int l,int r,int l1,int x,int y)
{
shan(root[a1],y);
cha(root[a1],x);
if(l==r)
return;
int mid=(l+r)>>;
if(l1<=mid)
change(a1*,l,mid,l1,x,y);
else
change(a1*+,mid+,r,l1,x,y);
return;
}
void xiqian(int a1,int l,int r,int l1,int r1,int x)
{
if(l1<=l&&r1>=r)
{
qian(root[a1],x);
return;
}
int mid=(l+r)>>;
if(l1<=mid)
xiqian(a1*,l,mid,l1,r1,x);
if(r1>mid)
xiqian(a1*+,mid+,r,l1,r1,x);
return;
}
void xihou(int a1,int l,int r,int l1,int r1,int x)
{
if(l1<=l&&r1>=r)
{
hou(root[a1],x);
return;
}
int mid=(l+r)>>;
if(l1<=mid)
xihou(a1*,l,mid,l1,r1,x);
if(r1>mid)
xihou(a1*+,mid+,r,l1,r1,x);
return;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&b[i]);
for(int i=;i<=n;i++)
build(,,n,i,b[i]);
for(int i=;i<m;i++)
{
int a1,a2,a3,a4;
scanf("%d%d%d",&a1,&a2,&a3);
if(a1==)
{
scanf("%d",&a4);
ans=;
xicha1(,,n,a2,a3,a4);
printf("%d\n",ans);
}
if(a1==)
{
scanf("%d",&a4);
xicha2(a2,a3,a4);
}
if(a1==)
{
change(,,n,a2,a3,b[a2]);
b[a2]=a3;
}
if(a1==)
{
ans=;
scanf("%d",&a4);
xiqian(,,n,a2,a3,a4);
printf("%d\n",ans);
}
if(a1==)
{
scanf("%d",&a4);
ans=;
xihou(,,n,a2,a3,a4);
printf("%d\n",ans);
}
}
return ;
}

却是是二逼平衡树。

bzoj 3196: Tyvj 1730 二逼平衡树的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

    传送门 题意 给你一个长度为 $ n $ 有序数列 $ a $ ,进行 $ m $ 次操作,操作有如下几种: 查询 $ k $ 在区间 $ [l,r] $ 内的排名 查询区间 $ [l,r] $ 内排 ...

  7. BZOJ - 3196 Tyvj 1730 二逼平衡树 (线段树套treap)

    题目链接 区间线段树套treap,空间复杂度$O(nlogn)$,时间复杂度除了查询区间k大是$O(log^3n)$以外都是$O(log^2n)$的. (据说线段树套线段树.树状数组套线段树也能过?) ...

  8. bzoj 3196 Tyvj 1730 二逼平衡树【线段树 套 splay】

    四舍五入就是个暴力. 对于线段树的每个区间都开一棵按权值排序的splay 对于第二个操作,二分一下,每次查询mid的排名,复杂度 $ O(nlog(n)^{3}) $ 其余的操作都是$ O(nlog( ...

  9. 【BZOJ】3196: Tyvj 1730 二逼平衡树(区间第k小+树套树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3196 Treap+树状数组 1WA1A,好伤心,本来是可以直接1A的,这次开始我并没有看题解,就写出 ...

随机推荐

  1. mysql replace

    replace(object, search,replace) 示例:update table set col1 = replace(col1, 'a', 'A'); 将col1字段中的小写a替换成大 ...

  2. divmod(a,b)函数是实现a除以b,然后返回商与余数的元组、eval可以执行一个字符串形式的表达式、exec语句用来执行储存在字符串或文件中的Python语句

    #!/usr/bin/env python a = 10/3 print(a) #divmod计算商与余数 r = divmod(10001,20) print(r) #eval可以执行一个字符串形式 ...

  3. blue and red ball

    #include<iostream> #include<cstring> using namespace std; int sum; ]; int n; int head; i ...

  4. UVA 11520 填充正方形

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. kali安装java1.7

    1.先去这里下载你需要的版本 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 我 ...

  6. JS作用域及call

    <script type="text/javascript"> function log(val){ console.log(val); } function base ...

  7. gulp入门演练

    一直想学习下gulp看了蛮多资料,然后总是感觉是是而非,突然开窍了,把自己学会的过程给大家分享下,入门超级简单的 gulp安装 安装gulp 如果参数-g 表示全局安装 $ npm install g ...

  8. C#常用错误

    解决方法: 在配置文件连接数据库设置后加 MultipleActiveResultSets=true; <add key="ConnectionString" value=& ...

  9. JAVA 1.8 理解面向对象程序设计

    1. break语句:经常用在循环语句中,用于跳出整个循环,执行循环后面的代码. 2. continue语句:经常用在循环语句中,用于跳出当前的这个循环(或者是跳出本次循环),开始下一次循环的执行. ...

  10. html4,xhtml,html5发展历史

    SGML SGML 是一种很强大但很复杂的标记语言,HTML.XML 就是从中衍生出来的.SGML 的例子如下:<QUOTE TYPE="example"> typic ...