数组是一种单点修改,单点查询的基础数据结构。

如果要对数组改进,使之可持久化,那么显然我们需要利用其它的数据结构来改进它。

对于单点修改和单点查询两种操作,很容易发现可持久化线段树也是支持这种操作的。

所以,我们利用可持久化线段树来维护一个可持久化数组

#include<cstdio>
#define mid ((l+r)>>1)
using namespace std;
const int maxn=1e6+5;
int tot,tree[maxn*20],ls[maxn*20],a[maxn],rs[maxn*20],rt[maxn],n,m,v,flag,loc,val;
int build(int l,int r)
{
int now=++tot;
if (l==r)
{
tree[now]=a[l];
return now;
}
ls[now]=build(l,mid);
rs[now]=build(mid+1,r);
return now;
}
int update(int root,int l,int r,int pnt,int val)
{
int now=++tot;
ls[now]=ls[root];
rs[now]=rs[root];
if (l==r&&l==pnt)
{
tree[now]=val;
return now;
}
else
{
if (l==r) return now;
if (pnt<=mid) ls[now]=update(ls[now],l,mid,pnt,val);
if (pnt>mid) rs[now]=update(rs[now],mid+1,r,pnt,val);
return now;
}
}
int query(int root,int l,int r,int pnt)
{
if (l==r&&l==pnt)
return tree[root];
int ret;
if (pnt<=mid) ret=query(ls[root],l,mid,pnt);
if (pnt>mid) ret=query(rs[root],mid+1,r,pnt);
return ret;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
rt[0]=build(1,n);
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&v,&flag,&loc);
if (flag==1)
{
scanf("%d",&val);
rt[i]=update(rt[v],1,n,loc,val);
}
else
{
rt[i]=rt[v];
printf("%d\n",query(rt[v],1,n,loc));
}
}
return 0;
}

最新文章

  1. 索引超出了数组界限(Microsoft.SqlServer.Smo)
  2. Windows 2008 R2+iis7.5环境下Discuz!X3论坛伪静态设置方法
  3. latex输入希腊字母
  4. extjs gride 显示序号
  5. 初学MFC
  6. mysql大数据高并发处理
  7. Project interpreter not specified(eclipse+pydev)
  8. jsp验证码页面笔记
  9. Directx11学习笔记【十二】 画一个旋转的彩色立方体
  10. Google官方MVP模式示例项目解析 todo-mvp
  11. Ext.Ajax.request
  12. 导入android SlidingMenu 应用
  13. 数学模块_math
  14. Linux之清理linux内存cache
  15. M100 组装教程
  16. BZOJ1494 [NOI2007]生成树计数
  17. python时间戳转时间
  18. MongDB 配置成本地服务
  19. Allegro怎么对元器件进行对齐
  20. JDBC 与 Bean Shell的使用(二)获取值,并且断言

热门文章

  1. 一步HTML5教程学会体系
  2. 生活中需要一台mac本子
  3. 利用nc当作备用shell管理方案.
  4. 关于连接sftp以及本地配置sftp的事情
  5. mpvue开发坑点总结
  6. 阿里云配置WAF的步骤
  7. CentOS / RHEL 7 更改时区
  8. ubuntu 防火墙打开关闭
  9. 敏感信息直接在 nginx 通过环境变量设置
  10. 聚类K-Means和大数据集的Mini Batch K-Means算法