题目描述

给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题。你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,包括询问指令和修改指令。

对于每一个询问指令,你必须输出正确的回答。

输入输出格式

输入格式:

第一行有两个正整数n(1≤n≤10000),m(1≤m≤10000)。分别表示序列的长度和指令的个数。

第二行有n个数,表示a[1],a[2]……a[n],这些数都小于10^9。接下来的m行描述每条指令,每行的格式是下面两种格式中的一种。 Q i j k 或者 C i t

  • Q i j k (i,j,k是数字,1≤i≤j≤n, 1≤k≤j-i+1)表示询问指令,询问a[i],a[i+1]……a[j]中第k小的数。

  • C i t (1≤i≤n,0≤t≤10^9)表示把a[i]改变成为t。

输出格式:

对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。

输入输出样例

输入样例#1:

5 3
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3
输出样例#1:

3
6

说明

20%的数据中,m,n≤100;

40%的数据中,m,n≤1000;

100%的数据中,m,n≤10000。

来源:bzoj1901

本题数据为洛谷自造数据,使用CYaRon耗时5分钟完成数据制作。

待修改的主席树,

裸的主席树修改很麻烦,

所以我们换一下思路。

用树状数组维护值,主席树只维护位置,

不要忘了离散化

 #include<cstdio>
#include<algorithm>
#define lowbit(x) (x)&(-x)
using namespace std;
const int MAXN=;
inline void read(int &n){char c='+';bool flag=;n=; while(c<''||c>'') c=='-'?flag=,c=getchar():c=getchar(); while(c>=''&&c<='') n=n*+c-,c=getchar();flag==?n=-n:n=n;}
int n,m,a[MAXN],/*原始序列 */di[MAXN],totnum;;
int root[MAXN],/* 根节点的编号*/totroot; int qx[MAXN],qxnum,qy[MAXN],qynum;
struct caozuo{int a,b,c;}ask[MAXN];
struct node{int ls,rs,size;}tree[MAXN];
void insert(int &rt,int l,int r,int pre,int pos,int how)
{
if(!rt) rt=++totroot; tree[rt].size=tree[pre].size+how;tree[rt].ls=tree[pre].ls;tree[rt].rs=tree[pre].rs;
if(l==r) return ;
int mid=(l+r)>>;
if(pos<=mid) insert(tree[rt].ls,l,mid,tree[pre].ls,pos,how);
else insert(tree[rt].rs,mid+,r,tree[pre].rs,pos,how);
}
void add(int pos,int how)//how表示是加还是减
{
int k=lower_bound(di+,di+totnum+,a[pos])-di;
for(int i=pos;i<=n;i+=lowbit(i)) insert(root[i],,totnum,root[i],k,how);
}
int query(int l,int r,int num)
{
if(l==r) return l;
int mid=(l+r)>>; int sum=;
for(int i=;i<=qxnum;i++) sum-=tree[tree[qx[i]].ls].size;
for(int i=;i<=qynum;i++) sum+=tree[tree[qy[i]].ls].size;
for(int i=;i<=qxnum;i++) qx[i]=num<=sum?tree[qx[i]].ls:tree[qx[i]].rs;;
for(int i=;i<=qynum;i++) qy[i]=num<=sum?tree[qy[i]].ls:tree[qy[i]].rs;
return num<=sum?query(l,mid,num):query(mid+,r,num-sum);
}
int main()
{
read(n);read(m);
for(int i=;i<=n;i++) read(a[i]),di[++totnum]=a[i];
for(int i=;i<=m;i++)
{
char c[];scanf("%s",c);
read(ask[i].a);read(ask[i].b);
if(c[]=='Q') read(ask[i].c);else di[++totnum]=ask[i].b;
}
sort(di+,di+totnum+);totnum=unique(di+,di+totnum+)-di;// 离散化
for(int i=;i<=n;i++) add(i,);// 把每一个数都加入到树状数组中
for(int i=;i<=m;i++)
{
if(ask[i].c)
{
qxnum=qynum=;
for(int j=ask[i].a-;j;j-=lowbit(j)) qx[++qxnum]=root[j];
for(int j=ask[i].b;j;j-=lowbit(j)) qy[++qynum]=root[j];
printf("%d\n",di[query(,totnum,ask[i].c)]);
}
else add(ask[i].a,-),a[ask[i].a]=ask[i].b,add(ask[i].a,);
}
return ;
}

P2617 Dynamic Ranking的更多相关文章

  1. 洛谷P2617 Dynamic Ranking(主席树,树套树,树状数组)

    洛谷题目传送门 YCB巨佬对此题有详细的讲解.%YCB%请点这里 思路分析 不能套用静态主席树的方法了.因为的\(N\)个线段树相互纠缠,一旦改了一个点,整个主席树统统都要改一遍...... 话说我真 ...

  2. 洛谷 P2617 Dynamic Ranking

    题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤ ...

  3. AC日记——Dynamic Ranking 洛谷 P2617

    Dynamic Ranking 思路: 可持久化树状数组: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...

  4. 【BZOJ1901】【Luogu2617】Dynamic Ranking(主席树,树状数组)

    [BZOJ1901][Luogu2617]Dynamic Ranking(主席树,树状数组) 题面 神TM BZOJ权限题 Luogu真良心 题解 如果不考虑修改 很容易的主席树区间第K大 考虑修改 ...

  5. P2617 Dynamic Rankings(树状数组套主席树)

    P2617 Dynamic Rankings 单点修改,区间查询第k大 当然是无脑树套树了~ 树状数组套主席树就好辣 #include<iostream> #include<cstd ...

  6. 2018.07.01洛谷P2617 Dynamic Rankings(带修主席树)

    P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i ...

  7. 洛谷P2617 Dynamic Rankings (主席树)

    洛谷P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a ...

  8. 洛谷 P2617 Dynamic Rankings 解题报告

    P2617 Dynamic Rankings 题目描述 给定一个含有\(n\)个数的序列\(a[1],a[2],a[3],\dots,a[n]\),程序必须回答这样的询问:对于给定的\(i,j,k\) ...

  9. 【学习笔鸡】整体二分(P2617 Dynamic Rankings)

    [学习笔鸡]整体二分(P2617 Dynamic Rankings) 可以解决一些需要树套树才能解决的问题,但要求询问可以离线. 首先要找到一个具有可二分性的东西,比如区间\(k\)大,就很具有二分性 ...

随机推荐

  1. 抓取豆瓣的电影排行榜TOP100

    #!/usr/bin/env python # -*- coding:utf-8 -*- """ 一个简单的Python爬虫, 用于抓取豆瓣电影Top前100的电影的名称 ...

  2. nginx.conf.default

    [root@web03 conf]# vim nginx.conf.default #user nobody;worker_processes 1; #error_log logs/error.log ...

  3. LVM的创建与挂载

    LVM的诞生: 由于传统的磁盘管理不能对磁盘进行磁盘管理,比如我把/dev/sdb1挂载到了/liu目录下,但是因为数据量过大的原因,此文件系统磁盘利用率已经高达98%,那么我可以直接对这个磁盘进行扩 ...

  4. Vue过渡与动画

    通过 Vue.js 的过渡系统,可以在元素从 DOM 中插入或移除时自动应用过渡效果.Vue.js 会在适当的时机为你触发 CSS 过渡或动画,你也可以提供相应的 JavaScript 钩子函数在过渡 ...

  5. Mac安装软件时,提示文件已损坏,需要移动到废纸篓的解决方法

    1.修改系统偏好设置,安全性与隐私-->将“允许从以下位置下载的应用” ☑️任何来源. 2. mac10.12以上的系统一般没有“任何来源”这个选项,需打开terminnal终端,输入 sudo ...

  6. 洛谷—— P1855 榨取kkksc03

    https://www.luogu.org/problem/show?pid=1855 题目描述 洛谷2的团队功能是其他任何oj和工具难以达到的.借助洛谷强大的服务器资源,任何学校都可以在洛谷上零成本 ...

  7. dll签名两种方法

    以下两种签名方法,都是对csp.dll签名,都不是CA颁发的,且效果不同, 一:通过自建证书签名 下载windows sdk,成功安装后,包括makecert.exe, cert2spc.exe, p ...

  8. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第1章节--SharePoint 2013 介绍 处理开发者需求

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第1章节--SharePoint 2013 介绍 处理开发者需求         SharePoint本质上是一个平台.你 ...

  9. 可能是东半球最全的RxJava使用场景小结

    一.Scheduler线程切换 这样的场景常常会在"后台线程取数据,主线程展示"的模式中看见 Observable.just(1, 2, 3, 4) .subscribeOn(Sc ...

  10. vijos - P1732能量採集 (状态转移)

    P1732能量採集 Accepted 标签:NOI2010[显示标签] 背景 描写叙述 栋栋有一块长方形的地.他在地上种了一种能量植物,这样的植物能够採集太阳光的能量. 在这些植物採集能量后,栋栋再使 ...