【传送门:caioj1442


简要题意:

  给出n个点,每个点都有一个权值,m个操作,操作有两种:第一种是询问l到r的第k小的值,然后输出这个值,第二种是将第x个点的值改为k


题解:

  又是一道主席树的例题,不过简直比前两题(caioj1441,caioj1443)难不止一点点

  看到第一种操作,我们可以用主席树来搞,但是第二种操作的话,我们就要用树状数组来维护每个第二种操作所带来的影响,而且每次要求第一种操作的时候都要先在树状数组中找到相应的点,然后再处理主席树


参考代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
int a[];
struct node
{
int lc,rc,c;
}tr[];int cnt;
int rt[];int n;
int ust[];//树状数组
int lowbit(int x)//树状数组用来找上司或下属
{
return x&-x;
}
void Link(int &u,int l,int r,int p,int c)
{
if(u==) u=++cnt;
tr[u].c+=c;
if(l==r) return ;
int mid=(l+r)/;
if(p<=mid) Link(tr[u].lc,l,mid,p,c);
else Link(tr[u].rc,mid+,r,p,c);
}
void Merge(int &u1,int u2)
{
if(u1==){u1=u2;return ;}
if(u2==) return ;
tr[u1].c+=tr[u2].c;
Merge(tr[u1].lc,tr[u2].lc);
Merge(tr[u1].rc,tr[u2].rc);
}
void Turn(int u,int c)//树状数组的实时更新
//c==-1时树状数组记录每个点所在线段树的根
//c==0时记录左孩子
//c==1时记录右孩子
{
while(u>=n+)
{
if(c==-) ust[u]=rt[u];
else if(c==) ust[u]=tr[ust[u]].lc;
else if(c==) ust[u]=tr[ust[u]].rc;
u-=lowbit(u);
}
}
void Modefy(int u,int p,int c)//对于修改值就用树状数组来节约时间
{
while(u<=*n)
{
Link(rt[u],,,p,c);
u+=lowbit(u);
}
}
int Getsum(int u)//求出修改过后树状数组得到的值
{
int ret=;
while(u>=n+)
{
ret+=tr[tr[ust[u]].lc].c;
u-=lowbit(u);
}
return ret;
}
int Ask(int u1,int u2,int p1,int p2,int l,int r,int p)
{
if(l==r) return l;
int c=tr[tr[u2].lc].c-tr[tr[u1].lc].c+Getsum(p2+n)-Getsum(p1+n);
int mid=(l+r)/;
if(p<=c)
{
Turn(p1+n,);
Turn(p2+n,);
return Ask(tr[u1].lc,tr[u2].lc,p1,p2,l,mid,p);
}
else
{
Turn(p1+n,);
Turn(p2+n,);
return Ask(tr[u1].rc,tr[u2].rc,p1,p2,mid+,r,p-c);
}
}
int main()
{
int m;
scanf("%d%d",&n,&m);
cnt=;memset(rt,,sizeof(rt));
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
Link(rt[i],,,a[i],);
Merge(rt[i],rt[i-]);
}
char st[];
for(int i=;i<=m;i++)
{
scanf("%s",st+);
if(st[]=='Q')
{
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
Turn(l+n-,-);
Turn(r+n,-);
printf("%d\n",Ask(rt[l-],rt[r],l-,r,,,k));
}
else
{
int p,c;
scanf("%d%d",&p,&c);
Modefy(p+n,a[p],-);
a[p]=c;
Modefy(p+n,a[p],);
}
}
return ;
}

最新文章

  1. MediaElement 的两种模式
  2. 《Inside UE4》目录
  3. (转)Intent flag 与启动模式的对应关系
  4. 在QTP中使用DOM
  5. jmeter参数化之CSV Data Set Config
  6. 测试TCP/IP配置
  7. Go:学习笔记兼吐槽(2)
  8. #001 Python 00号作业:关于课程
  9. 搭建一个dubbo+zookeeper平台
  10. 防止Web表单重复提交的方法总结
  11. 【Qt官方MQTT库的使用,附一个MqttClient例子】
  12. py-day4-3 python 内置函数 man和mix的高级使用
  13. python args kwargs 传递参数的区别
  14. 2013-7-30 802.1X企业级加密
  15. hdu 1004 颜色与数字(map水题)
  16. PHP如何动态传入参数
  17. ztree使用实例
  18. P3727 曼哈顿计划E
  19. java基础(九) 可变参数列表介绍
  20. PAT 1065 A+B and C[大数运算][溢出]

热门文章

  1. [USACO4.2]完美的牛栏The Perfect Stall
  2. Couldn&#39;t connect to Docker daemon at http+docker://localunixsocket - is it running?
  3. linux 空间不够了 修改 /boot
  4. 紫书 习题 8-15 UVa 1617 (贪心)
  5. POJ3370&amp;amp;HDU1808 Halloween treats【鸽巢原理】
  6. zookeeper图形界面工具zooinspector
  7. IE9+ BUG汇总
  8. WebView的坑[持续更新]
  9. 解决高版本vm打开虚拟机报错
  10. 运营商 WLAN