Description

给定一个含有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。

Input

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

Output

 

Sample Input

5 3
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3

Sample Output

3
6

HINT

20%的数据中,m,n≤100; 40%的数据中,m,n≤1000; 100%的数据中,m,n≤10000。

Source

依旧是模板,树状数组套主席树比较神奇,每个树状数组做一颗主席树,感觉树状数组学得不好啊。。。将时间提高到了nlog2n,注意离线的写法。

 #include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int sum[],ls[],rs[],root[],A[],B[],C[],num[],hash[],v[],L[],R[],flag[];
int n,m,nt,numt,sz,a,b;
int lowbit(int x){return x&(-x);} int find(int x)
{
int l=,r=nt,mid;
while (l<=r)
{
mid=(l+r)>>;
if (hash[mid]<x) l=mid+;
else r=mid-;
}
return l;
} void updata(int l,int r,int x,int &y,int p,int w)
{
y=++sz;
sum[y]=sum[x]+w;
ls[y]=ls[x]; rs[y]=rs[x];
if (l==r) return;
int mid=(l+r)>>;
if (p<=mid) updata(l,mid,ls[x],ls[y],p,w);
else updata(mid+,r,rs[x],rs[y],p,w);
} int query(int l,int r,int k)
{
if (l==r) return l;
int suml=,sumr=;
for (int i=;i<=a;i++) suml+=sum[ls[L[i]]];
for (int i=;i<=b;i++) sumr+=sum[ls[R[i]]];
int mid=(l+r)>>;
if (sumr-suml>=k)
{
for (int i=;i<=a;i++) L[i]=ls[L[i]];
for (int i=;i<=b;i++) R[i]=ls[R[i]];
return query(l,mid,k);
}
else
{
for (int i=;i<=a;i++) L[i]=rs[L[i]];
for (int i=;i<=b;i++) R[i]=rs[R[i]];
return query(mid+,r,k-(sumr-suml));
}
} int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
{
scanf("%d",&v[i]);
num[++numt]=v[i];
}
for (int i=;i<=m;i++)
{
char s[];
scanf("%s",s);
scanf("%d%d",&A[i],&B[i]);
if (s[]=='Q') {scanf("%d",&C[i]);flag[i]=;}
else num[++numt]=B[i];
}
sort(num+,num+numt+);
hash[++nt]=num[];
for (int i=;i<=numt;i++)
if (num[i]!=num[i-])
hash[++nt]=num[i];
for (int i=;i<=n;i++)
{
int t=find(v[i]);
for (int j=i;j<=n;j+=lowbit(j)) updata(,nt,root[j],root[j],t,);
}
for (int i=;i<=m;i++)
{
if (flag[i])
{
a=,b=;
int xx;
A[i]--;
for (int j=A[i];j>=;j-=lowbit(j)) L[++a]=root[j];
for (int j=B[i];j>=;j-=lowbit(j)) R[++b]=root[j];
xx=query(,nt,C[i]);
printf("%d\n",hash[xx]);
}
else
{
int t=find(v[A[i]]);
for (int j=A[i];j<=n;j+=lowbit(j)) updata(,nt,root[j],root[j],t,-);
v[A[i]]=B[i];
t=find(B[i]);
for (int j=A[i];j<=n;j+=lowbit(j)) updata(,nt,root[j],root[j],t,);
}
}
return ;
}

【BZOJ1901】Zju2112 Dynamic Rankings的更多相关文章

  1. 【BZOJ1901】Zju2112 Dynamic Rankings 主席树+树状数组

    [BZOJ1901]Zju2112 Dynamic Rankings Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j ...

  2. 【BZOJ1901】 Zju2112 Dynamic Rankings(树套树)

    [题意] 给定一个含有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. 【bzoj1901】Zju2112 Dynamic Rankings 离散化+主席树+树状数组

    题目描述 给定一个含有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≤ ...

  4. 【BOZJ 1901】Zju2112 Dynamic Rankings

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

  5. 【bzoj 1901】Zju2112 Dynamic Rankings

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

  6. 【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树

    外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个O(log2)的了 #include <cstdio> #include <v ...

  7. 【ZOJ】2112 Dynamic Rankings

    树状数组套主席树模板题目. /* 2112 */ #include <iostream> #include <sstream> #include <string> ...

  8. bzoj1901:Zju2112 Dynamic Rankings

    思路:树套树,我写了两种,一种是线段树套splay,线段树维护区间信息,splay维护第k大,一种是树状数组套权值线段树(并不是什么可持久化线段树,只不过是动态开点罢了,为什么网上一大堆题解都是可持久 ...

  9. BZOJ1901:Zju2112 Dynamic Rankings——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序 ...

随机推荐

  1. .net转的时间戳用java去解析的代码

    /// <summary> /// 转换成java解析一致的时间戳 /// </summary> /// <param name="time"> ...

  2. eclipse中的任务标记(TODO、FIXME、XXX)

    eclipse Task Tags: TODO -用来提醒该标识处的代码有待返回继续编写.更新或者添加.该标签通常在注释块的源文件顶部. FIXME -该标签用来提醒你代码中存在稍后某个时间需要修改的 ...

  3. Pyqt 设置 背景颜色和背景图片、 QPalette 调色板 与QPainter 画板区别 、 不规则图片

    设置 背景颜色和背景图片 首先设置autoFillBackground属性为真然后定义一个QPalette对象设置QPalette对象的背景属性(颜色或图片)最后设置QWidget对象的Palette ...

  4. How many Fibs?【sudt 2321】【大数的加法及其比较】

    How many Fibs? Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Recall the definition of t ...

  5. [LeetCode] Length of Last Word

    Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the l ...

  6. hibernate查询语句实例代码

    一.聚集函数的使用: avg(...), sum(...), min(...), max(...) count(*) count(...), count(distinct ...), count(al ...

  7. Parallel.js初探续集

    @author mrbean 例子均来源于github parallel.js 昨天写的第一篇今天一看居然有50+的阅读量了,感觉很激动啊,但是也有点害怕毕竟这只是自己笔记性质的一点东西,所以赶紧拿起 ...

  8. Windows和Windows Phone应用终于可以使用FFmpeg了

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:曾经在Windows Phone上想开发一个支持多种格式的媒体播放器是比较困难的一件事 ...

  9. javase基础笔记3——this关键字和内存图

    什么是面向对象? 面向过程. 面向过程:解决一个问题的思路和方法以及步骤 面向对象:把一些具有相同特征的问题抽象成一个对象,用""""对象.方法()" ...

  10. 【java基础】]IO流

    IO流 概念: 流的概念源于unix中管道(pipe)的概念,在unix中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备,外部文件等 一个流,一定能够会有源和去向(目的地),他 ...