CRB and Queries

Time Limit: 6000 MS Memory Limit: 131072 K

Problem Description

There are N boys in CodeLand.

Boy i has his coding skill Ai.

CRB wants to know who has the suitable coding skill.

So you should treat the following two types of queries.

Query 1: 1 l v

The coding skill of Boy l has changed to v.

Query 2: 2 l r k

This is a report query which asks the k-th smallest value of coding skill between Boy l and Boy r(both inclusive).

Input

There are multiple test cases.

The first line contains a single integer N.

Next line contains N space separated integers A1, A2, …, AN, where Ai denotes initial coding skill of Boy i.

Next line contains a single integer Q representing the number of queries.

Next Q lines contain queries which can be any of the two types.

1 ≤ N, Q ≤ 105

1 ≤ Ai, v ≤ 109

1 ≤ l ≤ r ≤ N

1 ≤ k ≤ r – l + 1

Output

For each query of type 2, output a single integer corresponding to the answer in a single line.

Sample Input

5

1 2 3 4 5

3

2 2 4 2

1 3 6

2 2 4 2

Sample Output

3

4

Author

KUT(DPRK)

Source

2015 Multi-University Training Contest 10

/*
动态区间第K小.
把操作离线.
修改操作视为一个删除操作和一个添加操作.
然后和静态处理方式相同.
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 400001
#define INF 1e9
using namespace std;
struct data{int x,y,k,s,o,cut;}
q[MAXN],tmp1[MAXN],tmp2[MAXN];
int n,m,tot,cut,s[MAXN],ans[MAXN],a[MAXN],tmp[MAXN];
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
void add(int x,int z)
{
while(x<=n) s[x]+=z,x+=x&-x;
return ;
}
int getsum(int x)
{
int sum=0;
while(x>0) sum+=s[x],x-=x&-x;
return sum;
}
void slove(int head,int tail,int l,int r)
{
if(head>tail) return ;
if(l==r)
{
for(int i=head;i<=tail;i++)
if(q[i].o==3) ans[q[i].s]=l;
return ;
}
int mid=(l+r)>>1;
for(int i=head;i<=tail;i++)//统计贡献.
{
if(q[i].o==1&&q[i].y<=mid) add(q[i].x,1);
else if(q[i].o==2&&q[i].y<=mid) add(q[i].x,-1);
else if(q[i].o==3) tmp[i]=getsum(q[i].y)-getsum(q[i].x-1);
}
for(int i=head;i<=tail;i++)
{
if(q[i].y<=mid)
{
if(q[i].o==1) add(q[i].x,-1);
else if(q[i].o==2) add(q[i].x,1);
}
}
int l1=0,l2=0;
for(int i=head;i<=tail;i++)
{
if(q[i].o==3)
{
if(q[i].cut+tmp[i]>q[i].k-1) tmp1[++l1]=q[i];
//对于该操作找一个所属答案位置.
else q[i].cut+=tmp[i],tmp2[++l2]=q[i];
}
else
{
if(q[i].y<=mid) tmp1[++l1]=q[i];
else tmp2[++l2]=q[i];
}
}
for(int i=1;i<=l1;i++) q[head+i-1]=tmp1[i];
for(int i=1;i<=l2;i++) q[head+l1+i-1]=tmp2[i];
slove(head,head+l1-1,l,mid),slove(head+l1,tail,mid+1,r);
return ;
}
void Clear()
{
memset(q,0,sizeof q);
//memset(s,0,sizeof s);
//memset(ans,0,sizeof ans);
tot=cut=0;return ;
}
int main()
{ int x,y,z,k;
while(scanf("%d",&n)!=EOF)
{
Clear();
for(int i=1;i<=n;i++)
{
a[i]=read();
q[++tot].x=i,q[tot].y=a[i];
q[tot].o=1,q[tot].s=0;
}
m=read();
while(m--)
{
z=read();
if(z==2)
{
x=read(),y=read(),k=read();
q[++tot].x=x,q[tot].y=y,q[tot].k=k;
q[tot].o=3;q[tot].s=++cut;
}
else
{
x=read(),y=read();
q[++tot].x=x,q[tot].y=a[x];
q[tot].o=2,q[tot].s=0;
q[++tot].x=x,q[tot].y=y;
q[tot].o=1,q[tot].s=0;
a[x]=y;
}
}
slove(1,tot,-INF,INF);
for(int i=1;i<=cut;i++) printf("%d\n",ans[i]);
}
return 0;
}

Hdu CRB and Queries(整体二分)的更多相关文章

  1. HDU - 5412 CRB and Queries (整体二分)

    题目链接 动态区间第k小,但是这道题的话用主席树+树状数组套线段树的空间复杂度是O(nlog2n)会爆掉. 另一种替代的方法是用树状数组套平衡树,空间复杂度降到了O(nlogn),但我感觉平衡树是个挺 ...

  2. hdu 5412 CRB and Queries(整体二分)

    题意 动态区间第k大 (n<=100000,m<=100000) 题解 整体二分的应用. 与静态相比差别不是很大.(和CDQ还有点像)所以直接上代码. #include<iostre ...

  3. HDU5412 CRB and Queries 整体二分

    传送门 刚觉得最近写代码比较顺畅没什么Bug,cdq分治真是我的一个噩梦.. 整体二分模板题,带修改的区间第k小. vjudge不知抽什么风,用不了,hdu忘了密码了一直在那里各种试,难受.. 写得比 ...

  4. hdu 5412 CRB and Queries

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5412 CRB and Queries Description There are $N$ boys i ...

  5. HDU 5412——CRB and Queries——————【线段树套Treap(并没有AC)】

    CRB and Queries Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  6. 整体二分 HDU - 5808

    题目大意 有n个物品,排成一个序列,每个物品有一个di表示取到i要走的距离,vi表示i的价值. 给m组询问[l,r] ,c,sum,问由[l,r]的di<=c的物品能否凑出sum的价值(每个物品 ...

  7. 2015 Multi-University Training Contest 10 hdu 5412 CRB and Queries

    CRB and Queries Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  8. (困难) CF 484E Sign on Fence,整体二分+线段树

    Bizon the Champion has recently finished painting his wood fence. The fence consists of a sequence o ...

  9. CQD(陈丹琦)分治 & 整体二分——专题小结

    整体二分和CDQ分治 有一些问题很多时间都坑在斜率和凸壳上了么--感觉斜率和凸壳各种搞不懂-- 整体二分 整体二分的资料好像不是很多,我在网上找到了一篇不错的资料:       整体二分是个很神的东西 ...

随机推荐

  1. 淘宝API总结

    1. 淘宝客API https://open.alimama.com/?spm=a219t.11816995.1998910419.d8546b700.2a8f75a5C0NajI#!/documen ...

  2. VC 中的ATL ActiveX 和 MFC ActiveX 有什么区别

    原文转自 https://www.cnblogs.com/zhwl/archive/2012/11/29/2794509.html ATL是ActiveXTemplateLibrary的缩写,它是一套 ...

  3. C# mailKit 发邮件 简单代码

    public static async Task<bool> SendMailAsync22(string Name, string receive, string sender, str ...

  4. aliyun maven仓库连不上

    长时间未使用maven仓库,今天使用发现始终无法下载jar包,连不上阿里云maven仓库. 因为之前一直使用正常,以为是idea maven设置的有问题,再三确认地址无误,maven offline也 ...

  5. vue滚动分页加载以及监听事件处理

    <template> <div class="bodyContainer"> <div class="allContent" id ...

  6. Redis其他数据结构

    用户日活月活怎么统计 - Redis HyperLogLog 详解 HyperLogLog 提出问题 我们先思考一个常见的业务问题:如果你负责开发维护一个大型的网站,有一天老板找产品经理要网站每个网页 ...

  7. 认识和学习redis

    redis VS mysql """ redis: 内存数据库(读写快).非关系型(操作数据方便) mysql: 硬盘数据库(数据持久化).关系型(操作数据间关系) 大量 ...

  8. URLErro和HTTPError

    url error URLError 产生的原因主要有: 没有网络连接 服务器连接失败 找不到指定的服务器 我们可以用try except语句来捕获相应的异常 from urllib import r ...

  9. 外网Telnet虚拟机,及nat配置等

    环境整体是使用GNS3,通过cloud真实连接到虚拟机 cloud1 nginx主机 cloud2 nginx主机https连接 cloud3 Internet测试主机 下面贴每个网络设备配置,特别注 ...

  10. Android笔记(十二)AndroidManiFest.xml

    AndroidManiFest.xml清单文件是每个Android项目所必须的,它是整个Android应用的全局描述文件.AndroidManiFest.xml清单文件说明了该应用的名称.所使用的图标 ...