数列[专杀Splay版]

时间限制: 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=200001;
int n,m;
struct node
{
    int key,rev,size;
    node *child[2],*father;
}bst[maxn],*root;
node *pos=bst;
queue<node*>mem;
void update(node* &r)
{
    if(r)
    r->size=(r->child[0]!=NULL?r->child[0]->size:0)+(r->child[1]!=NULL?r->child[1]->size:0)+1;
}
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=0;
    r->rev=rand();
    r->child[1]=r->child[0]=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[1]&&r->child[0])
        {
            bool b=r->child[0]->rev<r->child[1]->rev;
            rotate(r,b);
            delet(r->child[b],key);
        }
        else
        {
            mem.push(r);
            if(r->child[0])r=r->child[0];
            else r=r->child[1];
        }
    }
    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=0,f=1;
    for(i=begin;i<len;i++)
    {
        if(s[i]>=‘0‘&&s[i]<=‘9‘)  ans=ans*10+s[i]-‘0‘;
        else if(s[i]==‘-‘)f=-1;
        else break;
    }
    if(begin==i)return 2000000000;
    end=i+1;
    return ans*f;
}
int find(node* &r,int x)
{
    if(r==NULL)return 2000000000;
    if(r->child[0]!=NULL&&x==r->child[0]->size)return r->key;
    if(!x&&r->child[0]==NULL)return r->key;
    if(!x)return find(r->child[0],x);
    if(r->child[0]!=NULL&&r->child[1]!=NULL)
    {
        int t=r->child[0]->size;
        if(t>x)return find(r->child[0],x);
        else if(t<x)return find(r->child[1],x-t-1);
    }
    else
    {
        if(r->child[0]==NULL)return find(r->child[1],x-1);
        if(r->child[1]==NULL)return find(r->child[0],x);
    }
    return 2000000000;
}
int a[maxn];
int main()
{
    int i,j;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&j);
        a[i]=j;
        insert(root,j);
    }
    char s[101];
    getchar();
    for(i=1;i<=m;i++)
    {
        len=0;
        while(len==0)gets(s),len=strlen(s);
        int x=read(s,0),y=read(s,end);
        if(y!=2000000000)
        {
            delet(root,a[x]);
            a[x]=y;
            insert(root,a[x]);
        }
        else
        {
            int ans=find(root,x-1);
            if(ans!=2000000000)
            printf("%d\n",ans);
        }
    }
    return 0;
}
时间: 2024-11-09 13:21:02

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

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

catalog 1. 安装及使用方式 2. 检查DEDECMS是否为最新版本 3. 检查默认安装(install)目录是否存在 4. 检查默认后台目录(dede)是否存在 5. 检查DedeCMS会员中心是否关闭 6. 检查是否存在高风险的若密码账户 7. 后台友情链接xss漏洞 8. /plus/search.php SQL注入漏洞 9. /plus/feedback.php SQL注入漏洞 10. /plus/feedback_ajax.php SQL注入或XSS漏洞漏洞 11. /incl

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

       本系列教程版权归"i春秋"所有,转载请标明出处. 本文配套视频教程,请访问"i春秋"(www.ichunqiu.com). 前言 经过前几次的讨论,我们对于这次的U盘病毒已经有了一定的了解,那么这次我们就依据病毒的行为特征,来编写针对于这次U盘病毒的专杀工具. 专杀工具功能说明 因为这次是一个U盘病毒,所以我打算把这次的专杀工具换一种形式实现.不再像前几次那样需要被动运行,而是当我们的专杀工具执行后,一旦有U盘插入,就能主动检测U盘内容,如果发现病毒,

xor和gates的专杀脚本

前段时间的一次样本,需要给出专杀,应急中遇到的是linux中比较常见的两个家族gates和xor. 首先是xor的专杀脚本,xor样本查杀的时候需要注意的是样本的主进程和子进程相互保护(详见之前的xor ddos分析http://www.cnblogs.com/goabout2/p/4888651.html),想要杀掉的话,需要先通过kill –stop挂起主进程,再删除其他的文件,但是由于xor的进程名是随机值,同时主机上还有有gates木马(gates最显著的特征就是会替换系统文件ps,ls

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

一.前言 由于我已经在<病毒木马查杀第004篇:熊猫烧香之专杀工具的编写>中编写了一个比较通用的专杀工具的框架,而这个框架对于本病毒来说,经过简单修改也是基本适用的,所以本文就不讨论那些重叠的知识,只针对这个病毒特有的方面来讨论专杀工具的编写,然后将其进行组合,就是完整的针对于本病毒的专杀工具了. 二.原理讨论 对于本病毒而言,其最大的特色就在于使用了进程守护技术.病毒运行后,同时有三个病毒进程存在,关闭其中的任何一个,由于还有两个病毒进程的存在,那么被关闭的又会被重新开启.要解决这个问题,不

病毒木马查杀第004篇:熊猫烧香之专杀工具的编写

一.前言 如果是非感染型的病毒,完成行为分析之后,就可以开始编写专杀工具了.当然对于我们这次研究的对象--"熊猫烧香"来说,其实通过之前的行为分析,我们并没有得出它的所有恶意行为,毕竟还没有对其进行逆向分析.所以这里仅针对我们上一篇文章所得出的结果,来进行专杀工具的编写.一般来说,专杀工具既可以用批处理实现,又可以用编程语言编写,但是现实中更多的还是用后者进行制作的,因为其更加严谨.灵活.因此我这里会使用C++来写一个简单的"熊猫烧香"专杀程序. 二.病毒行为回顾与

服务器杀毒软件推荐--服务器安全狗2合1杀毒版来啦

服务器安全狗是国内首款支持windows全系列操作系统(Windows2003/Windows2008/Windows2012)的免费服务器安全防护软件,它拥有服务器优化.系统漏洞修复.系统实时保护.拦截各种网络威胁.保护文件不被篡改等诸多个强劲功能,为每一个用户提供全方位的服务器安全防护,其安装量在国内的服务器安全防护领域市场遥遥领先,聚集了百万的用户. 近日,服务器安全狗V4.2(2合1杀毒版)发布,该版本新增优化了多项功能,在远程桌面保护.账户保护以及用户体验上都有了大幅度的提升,同时也极

1500. [NOI2005]维修数列【平衡树-splay】

Description 请写一个程序,要求维护一个数列,支持以下 6 种操作: 请注意,格式栏 中的下划线‘ _ ’表示实际输入文件中的空格 Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目. 第2行包含N个数字,描述初始时的数列. 以下M行,每行一条命令,格式参见问题描述中的表格. 任何时刻数列中最多含有500 000个数,数列中任何一个数字均在[-1 000, 1 000]内. 插入的数字总数不超过4 000 000个,

【POJ3580】【splay版】SuperMemo

Description Your friend, Jackson is invited to a TV show called SuperMemo in which the participant is told to play a memorizing game. At first, the host tells the participant a sequence of numbers, {A1, A2, ... An}. Then the host performs a series of

bzoj1861 书架 splay版

单点插入删除以及求前缀 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int M=100055,inf=1000000000; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&am