时间限制: 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. 通过Servlet实现汉字验证码

    package com; import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Gra ...

  2. 谈谈RDD、DataFrame、Dataset的区别和各自的优势

    在spark中,RDD.DataFrame.Dataset是最常用的数据类型,本博文给出笔者在使用的过程中体会到的区别和各自的优势 共性: 1.RDD.DataFrame.Dataset全都是spar ...

  3. (jquery+ajax)省市区三级联动(封装和不封装两种方式)-----2017-05-14

    首先,要实现如下图效果, 1.要理清思路: 先做出三个下拉菜单----根据第一个下拉菜单的value值获取第二个下拉列表的内容,第三个同理. 2.用到的数据库表:Chinastates表 规律:根据国 ...

  4. Java面试题之最扯淡的String

    public class ThreadException { public static void main(String[] args) { 没加final的代码 String hello = &q ...

  5. MySQL 闪回工具之 binlog2sql

    生产上误删数据.误改数据的现象也是时常发生的现象,作为 DBA 这时候就需要出来补锅了,最开始的做法是恢复备份,然后从中找到需要的数据再进行修复,但是这个时间太长了,对于大表少数数据的修复来讲,动作太 ...

  6. JAVA printWriter中write()和println()区别

    PrintWriter 的Write()方法和println()方法有何细微的区别? 最近学习JAVA网络编程,在服务器端和客户端产生一个Socket 后, 两边各自用getIputStream()和 ...

  7. GTD:让大脑用来思考,而不是用来记事!

    前段时间听刘润大师分享了一套GTD时间管理方法理论,感觉非常受用!现拿来跟大家分享下,这套方法是刘润老师践行20多年总结提炼的精华,经亲自实践确实行之有效. 俗话说:工欲善其事,必先利其器!人生也是如 ...

  8. (转ORCLE导入导出命令)

    oracle数据库导入导出命令! Oracle数据导入导出imp/exp 功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备份.   大多情况都可以用Oracle数据导入导出 ...

  9. 树莓派安装FLASK服务;并在端网页读取 GPIO状态和系统时间

    做过一些物联网的作品:因为不想一直做APP来控制,因为不能每个人都去下载你自己做的APP,浏览器大家都是有的:那么每个人通过浏览器WEB来访问我们服务器,岂不是很简单和方便,采用flask+pytho ...

  10. aws上redhat安装lmysql服务记

    aws上redhat安装lmysql服务记 1.准备材料 1.1