Description


Input

从文件 pigeon.in 中读入数据。
输入第一行包含两个正整数 n, m ,分别表示初始鸽笼数与操作个数。
第二行包含 n 个正整数,第 i 个数表示从左往右第 i 个初始鸽笼中鸽子的咕咕能力值 vi 。
接下去 m 行每行表示一个操作。操作输入格式见题面描述。

Output

输出到文件 pigeon.out 中。
输出包含若干行,每行表示一个相应的 3 操作的答案。

Sample Input

6 8
2 7 4 3 5 9
3 2 5 3
1
2 4
3 1 4 2
2 6
3 1 7 5
1
3 3 6 4

Sample Output

5
4
6
9

Data Constraint


题目更正:vi值域小于等于1e9。

Solution

  • 改修主席树??

  • 其实不需要,我们只需要倒过来建静态的主席树即可,因为插入删除都是在最左端。

  • 为了节约一点点空间,我还打了个离散化。。

  • 时间复杂度 O(nlogn)O(n\ log\ n)O(n log n) 。

Code

#include<cstdio>
#include<algorithm>
#include<cctype>
using namespace std;
const int N=2e5+5;
struct data
{int v,l,r;
}f[N*38],c[N];
struct number
{int x,id;
}a[N<<1];
int tot,num,qx,len;
int rt[N<<1],rk[N<<1],pos[N];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
void write(int x)
{if(x>9) write(x/10);putchar(x%10+'0');
}
inline bool cmp(number x,number y)
{return x.x<y.x;
}
void make(int &v,int l,int r)
{v=++tot;if(l==r) return;int mid=l+r>>1;make(f[v].l,l,mid);make(f[v].r,mid+1,r);
}
void insert(int &x,int pre,int l,int r)
{f[x=++tot]=f[pre];f[x].v++;if(l==r) return;int mid=l+r>>1;if(qx<=mid) insert(f[x].l,f[pre].l,l,mid); else insert(f[x].r,f[pre].r,mid+1,r);
}
int find(int x,int pre,int l,int r,int k)
{if(l==r) return a[l].x;int mid=l+r>>1,v=f[f[x].l].v-f[f[pre].l].v;if(v>=k) return find(f[x].l,f[pre].l,l,mid,k);return find(f[x].r,f[pre].r,mid+1,r,k-v);
}
int main()
{freopen("pigeon.in","r",stdin);freopen("pigeon.out","w",stdout);int n=num=read(),m=read();for(int i=n;i;i--) a[a[i].id=i].x=read();for(int i=1;i<=m;i++){c[i].v=read()-2;if(!c[i].v){c[i].l=read();a[++num].x=c[i].l;a[num].id=num;pos[i]=num;}elseif(c[i].v>0) c[i].l=read(),c[i].r=read(),c[i].v=read();}sort(a+1,a+1+num,cmp);for(int i=1;i<=num;i++) rk[a[i].id]=i;make(rt[0],1,num);for(int i=1;i<=n;i++){len++;qx=rk[i];insert(rt[len],rt[len-1],1,num);}for(int i=1;i<=m;i++){if(c[i].v<0){rt[len--]=0;}elseif(!c[i].v){len++;qx=rk[pos[i]];insert(rt[len],rt[len-1],1,num);}else{int l=len-c[i].r+1,r=len-c[i].l+1,k=c[i].v;int ans=find(rt[r],rt[l-1],1,num,k);write(ans),putchar('\n');}}return 0;
}

JZOJ 5933. 【NOIP2018模拟10.27】百鸽笼相关推荐

  1. JZOJ 5931. 【NOIP2018模拟10.27】冒泡排序

    Description 题目背景 冒泡排序的交换次数被定义为交换过程的执行次数. 题面描述 小 S 开始专注于研究⻓度为 n 的排列,他想知道,在你运气足够好的情况下(即每次冒泡排序的交换次数都是可能 ...

  2. JZOJ 5932. 【NOIP2018模拟10.27】情报中心

    Description 题目背景 .飞纷火战来年近国 D 和国 C .飞乱子鸽来年近国 D 和国 C 题面描述 最近,C 国成功地渗透进入了 D 国的一个城市.这个城市可以抽象成一张有 n 个节点,节 ...

  3. [JZOJ 5909] [NOIP2018模拟10.16] 跑商(paoshang) 解题报告 (圆方树)

    题目链接: https://jzoj.net/senior/#contest/show/2529/2 题目: 题目背景: 尊者神高达很穷,所以他需要跑商来赚钱 题目描述: 基三的地图可以看做 n 个城 ...

  4. [JZOJ 5911] [NOIP2018模拟10.18] Travel 解题报告 (期望+树形DP)

    题目链接: http://172.16.0.132/senior/#contest/show/2530/1 题目: EZ同学家里非常富有,但又极其的谦虚,说话又好听,是个不可多得的人才.       ...

  5. jzoj 5906. 【NOIP2018模拟10.15】传送门(树形dp)

    5906. [NOIP2018模拟10.15]传送门 Description 8102年,Normalgod在GLaDOS的帮助下,研制出了传送枪.但GLaDOS想把传送枪据为己有,于是把Normal ...

  6. jzoj5904. 【NOIP2018模拟10.15】刺客信条(并查集)

    5904. [NOIP2018模拟10.15]刺客信条 Description 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决心成为一 ...

  7. jzoj5920. 【NOIP2018模拟10.21】风筝(dp,最长上升子序列)

    5920. [NOIP2018模拟10.21]风筝 Description 当一阵风吹来,风筝飞上天空,为了你,而祈祷,而祝福,而感动-- Description oyiya 在 AK 了 IOI 之 ...

  8. JZOJ 5939. 【NOIP2018模拟10.30】阻击计划

    Description 最近,小J发现小R和小Z之间的关系十分密切,心中十分嫉妒,为了拆散他们,小J经常扰乱他们一起玩耍的计划. 问题描述 小R和小Z打算在这个周末一起骑车在G国的城市看风景,G国的城 ...

  9. JZOJ 5938. 【NOIP2018模拟10.30】分离计划

    Description 众所周知,小Z拥有者足以毁灭世界的力量,可惜他不能控制这份力量,小J和小Z的关系十分亲密,一天小J预感到了小Z体内的力量将要爆发. 这次爆发的力量比以往都要强大,以至于将小Z分 ...

最新文章

  1. Day20 Ajax
  2. 通讯录(容量不可变)
  3. golang 库 go-restful 中 https basic authentication 基础认证实例
  4. XPath访问任意深度的XML数据
  5. 颠覆传统的电商智能助理-阿里小蜜技术揭秘
  6. (43)内存装载驱动
  7. CentOS SSH公钥登录问题
  8. java文件改成smla,Java base64 转 FileInputStream
  9. candence的图纸大小设置_提前感受一下,CAD高手的字体和标注设置原则
  10. Android学习笔记---15_采用Pull解析器解析和生成XML内容
  11. 吴恩达机器学习13.推荐系统
  12. 信息系统项目管理笔记
  13. DB9串口和RJ45接线图
  14. 我为什么读博, 以及我为什么不读博?这是个问题!
  15. 形如in (‘111,222,333‘) 的 ,Oracle的in函数(报错:无效数字)
  16. java中怎么审阅图片_java – Crucible REST API:无法添加审阅者
  17. WIFISON使用及适配
  18. 唤醒手腕Python全栈工程师学习笔记(微机实验篇)
  19. Android的增量更新
  20. [ant design vue] 表单验证成功,提示信息不显示

热门文章

  1. Go 语言 练习 聊天室 01
  2. 机器学习导论(张志华):多元高斯分布及应用
  3. 惩罚、补偿、正则化、约束的联系和区别
  4. JVM_垃圾收集器与内存分配策略01
  5. 无功功率控制模式matlab,第9章_MATLAB在风力发电技术中的应用仿真.ppt
  6. matlab按顺序排列图片,小技巧
  7. 【Python】统计字符串里某个字符或子字符串出现的次数
  8. [NTU-Machine-learning-note]1 Introduction(2)
  9. [C++调试笔记]推动粒子move.cpp
  10. 今天遭遇了同样的坑,折腾了一上午