时间限制: 3 Sec  内存限制: 128 MB
提交: 49  解决: 7

题目描述

输入一个数列,你需要进行如下操作: 
1、 把编号为I的数值改为K 
2、 输出从小到大排序后第k个数

输入

输入文件第一行包含两个整数N、M,分别表示数列长度与操作个数。 
第二行有N个整数,为初始数列中的N个整数。 
接下来M行每行如果只有一个整数k,那么就是输出第k小数,否则两个整数I,K表示把第I个数的数值改为K。

输出

输出所有要求输出的数,每个数单独一行。

样例输入

5 3
5 3 2 1 1
4
2 6
4

样例输出

3
5

提示

N,M≤200,000
数列中所有数字的绝对值不大于100,000,000
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<ctime>
using namespace std;
const int maxn=;
int n,m;
struct node
{
int key,rev,size;
node *child[],*father;
}bst[maxn],*root;
node *pos=bst;
queue<node*>mem;
void update(node* &r)
{
if(r)
r->size=(r->child[]!=NULL?r->child[]->size:)+(r->child[]!=NULL?r->child[]->size:)+;
}
void rotate(node* &r,int b)
{
node *y=r->child[!b];
r->child[!b]=y->child[b];
y->child[b]=r;
update(r);
r=y;
update(r);
}
void newnode(node* &r,int key)
{
if(mem.empty())r=pos++;
else r=mem.front(),mem.pop();
r->key=key;
r->size=;
r->rev=rand();
r->child[]=r->child[]=NULL;
}
void insert(node* &r,int key)
{
if(!r)newnode(r,key);
else
{
bool b=r->key<key;
insert(r->child[b],key);
if(r->child[b]->rev<r->rev)
rotate(r,!b);
}
update(r);
}
void delet(node* &r,int key)
{
if(!r)return;
if(r->key==key)
{
if(r->child[]&&r->child[])
{
bool b=r->child[]->rev<r->child[]->rev;
rotate(r,b);
delet(r->child[b],key);
}
else
{
mem.push(r);
if(r->child[])r=r->child[];
else r=r->child[];
}
}
else
{
bool b=r->key<key;
delet(r->child[b],key);
}
update(r);
}
int end,len;
int read(char s[],int begin)
{
int i,ans=,f=;
for(i=begin;i<len;i++)
{
if(s[i]>=''&&s[i]<='') ans=ans*+s[i]-'';
else if(s[i]=='-')f=-;
else break;
}
if(begin==i)return ;
end=i+;
return ans*f;
}
int find(node* &r,int x)
{
if(r==NULL)return ;
if(r->child[]!=NULL&&x==r->child[]->size)return r->key;
if(!x&&r->child[]==NULL)return r->key;
if(!x)return find(r->child[],x);
if(r->child[]!=NULL&&r->child[]!=NULL)
{
int t=r->child[]->size;
if(t>x)return find(r->child[],x);
else if(t<x)return find(r->child[],x-t-);
}
else
{
if(r->child[]==NULL)return find(r->child[],x-);
if(r->child[]==NULL)return find(r->child[],x);
}
return ;
}
int a[maxn];
int main()
{
int i,j;
scanf("%d%d",&n,&m);
for(i=;i<=n;i++)
{
scanf("%d",&j);
a[i]=j;
insert(root,j);
}
char s[];
getchar();
for(i=;i<=m;i++)
{
len=;
while(len==)gets(s),len=strlen(s);
int x=read(s,),y=read(s,end);
if(y!=)
{
delet(root,a[x]);
a[x]=y;
insert(root,a[x]);
}
else
{
int ans=find(root,x-);
if(ans!=)
printf("%d\n",ans);
}
}
return ;
}

数列[专杀Splay版]的更多相关文章

  1. DedeCMS顽固木马后门专杀工具V2.0实现方式研究

    catalog . 安装及使用方式 . 检查DEDECMS是否为最新版本 . 检查默认安装(install)目录是否存在 . 检查默认后台目录(dede)是否存在 . 检查DedeCMS会员中心是否关 ...

  2. xor和gates的专杀脚本

    前段时间的一次样本,需要给出专杀,应急中遇到的是linux中比较常见的两个家族gates和xor. 首先是xor的专杀脚本,xor样本查杀的时候需要注意的是样本的主进程和子进程相互保护(详见之前的xo ...

  3. PAT 1089 狼人杀-简单版(20 分)(代码+测试点分析)

    1089 狼人杀-简单版(20 分) 以下文字摘自<灵机一动·好玩的数学>:"狼人杀"游戏分为狼人.好人两大阵营.在一局"狼人杀"游戏中,1 号玩家 ...

  4. 【旧文章搬运】PE感染逆向之修复(Serverx.exe专杀工具出炉手记)

    原文发表于百度空间,2008-10-4看雪论坛发表地址:https://bbs.pediy.com/thread-73948.htm================================== ...

  5. PAT(B) 1089 狼人杀-简单版(Java)逻辑推理

    题目链接:1089 狼人杀-简单版 (20 point(s)) 题目描述 以下文字摘自<灵机一动·好玩的数学>:"狼人杀"游戏分为狼人.好人两大阵营.在一局" ...

  6. DesktopLayer.exe专杀

    这两天发现电脑卡慢. 同事电脑发现病毒,而后装上杀软后(一直在裸奔~~~),发现自己电脑也存在. DesktopLayer.exe 会有以下几个行为: 第一,会在C:\Program Files (x ...

  7. P10891089 狼人杀-简单版

    1089 狼人杀-简单版 (20分)   以下文字摘自<灵机一动·好玩的数学>:“狼人杀”游戏分为狼人.好人两大阵营.在一局“狼人杀”游戏中,1 号玩家说:“2 号是狼人”,2 号玩家说: ...

  8. 病毒木马查杀实战第011篇:QQ盗号木马之专杀工具的编写

    前言 由于我已经在<病毒木马查杀第004篇:熊猫烧香之专杀工具的编写>中编写了一个比较通用的专杀工具的框架,而这个框架对于本病毒来说,经过简单修改也是基本适用的,所以本文就不讨论那些重叠的 ...

  9. 病毒木马查杀实战第017篇:U盘病毒之专杀工具的编写

    前言 经过前几次的讨论,我们对于这次的U盘病毒已经有了一定的了解,那么这次我们就依据病毒的行为特征,来编写针对于这次U盘病毒的专杀工具. 专杀工具功能说明 因为这次是一个U盘病毒,所以我打算把这次的专 ...

随机推荐

  1. Lua快捷键

      快捷键 含义 ctrl + shift + L 多行编辑 ctrl + D 继续向下选中下一个相同的文本 Alt + F3 选中所有相同所选中德文本                        

  2. 跨交换机相同vlan内的通信(trunk模式)

    当一个公司的小型局域网内部,处于不同楼层的主机处在同一个虚拟局域网内,连接到不同的交换机上,这时候就需要相同虚拟局域网内部的主机进行跨交换机进行通信. 通过设置交换机之间相连接的端口开启trunk模式 ...

  3. Java学习笔记——设计模式之四.代理模式

    To be, or not to be: that is the question. --<哈姆雷特> 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 上代码: p ...

  4. LeetCode:36. Valid Sudoku,数独是否有效

    LeetCode:36. Valid Sudoku,数独是否有效 : 题目: LeetCode:36. Valid Sudoku 描述: Determine if a Sudoku is valid, ...

  5. TCP三次握手(建立连接)/四次挥手(关闭连接)

    TCP数据包格式 顺序号(32位):用来标识从TCP源端向TCP目的端发送的数据字节流,它表示在这个报文段中的第一个数据字节的顺序号.如果将字节流看作在两个应用程序间的单向流动,则TCP用顺序号对每个 ...

  6. Natas Wargame Level 15 Writeup(Content-based Blind SQL Injection)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAq4AAACGCAYAAAAcnwh0AAAABHNCSVQICAgIfAhkiAAAIABJREFUeF

  7. YYLabel 自动布局 富文本文字点击事件

    YYLabel显示多行除了需要设置numberOfLines = 0以外,还需要设置preferredMaxLayoutWidth最大的宽度值才可以生效多行效果 YYLabel中的NSMutableA ...

  8. axis2 和 xfire 接口调用问题排查

    背景: 1个运营商厂家开发人员离职,我们为了上线对接接口,迁就对方客户端调用.对方客户端框架用的是xfire.调用方式基本为:   Service serviceModel = new ObjectS ...

  9. JS实现鼠标移上去图片停止滚动移开恢复滚动效果

    这是在做个人站的时候展示项目成果,因为不光需要展示,还需要介绍详细内容,就在滚动展示的地方做了这个效果以便于点开想要看的项目. 首先,要做的是一个需要滚动的区域.我前边写过一个关于图片循环滚动的示例, ...

  10. JS 正则表达式否定匹配(正向前瞻)

    引言:JS 正则表达式是 JS 学习过程中的一大难点,繁杂的匹配模式足以让人头大,不过其复杂性和其学习难度也赋予了它强大的功能.文章从 JS 正则表达式的正向前瞻说起,实现否定匹配的案例.本文适合有一 ...