题面:【模板】可持久化数组(可持久化线段树/平衡树)

不知道说啥,总之我挺喜欢自己打的板子的!

 #include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
inline int rd(){
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return f*x;
}
const int maxn=(1e6)+,maxm=maxn;
int N,M,num_treenode=,root[maxm],belong_root[maxm],num_root=,u,num_version=,A[maxn],V,loc,o,val;
struct Tree{
int ls,rs,l,r,data;
}t[(maxn<<)+*maxm];
inline void Build(int x,int l,int r){
t[x].l=l;t[x].r=r;
if(l==r){
t[x].data=A[l];
return;
}
int mid=(l+r)>>;
t[x].ls=++num_treenode;Build(num_treenode,l,mid);
t[x].rs=++num_treenode;Build(num_treenode,mid+,r);
return;
}
inline void Update(int x,int u,int loc,int v){
int l=t[u].l,r=t[u].r,mid=(l+r)>>;
t[x].l=l;t[x].r=r;
if(l==r&&l==loc){
t[x].data=v;
return;
}
if(loc<=mid){
t[x].rs=t[u].rs;
t[x].ls=++num_treenode;
Update(num_treenode,t[u].ls,loc,v);
}
else{
t[x].ls=t[u].ls;
t[x].rs=++num_treenode;
Update(num_treenode,t[u].rs,loc,v);
}
return;
}
inline int Query(int x,int loc){
int l=t[x].l,r=t[x].r,mid=(l+r)>>;
if(l==r&&l==loc) return t[x].data;
if(loc<=mid)return Query(t[x].ls,loc);
else return Query(t[x].rs,loc);
}
int main(){
N=rd();M=rd();
for(int i=;i<=N;i++)A[i]=rd();
root[++num_root]=++num_treenode;//root[i]数组记录树i的根节点是哪个
belong_root[]=num_root;//belong_root[i]记录版本i的树根是哪个
Build(num_treenode,,N);
while(M--){
V=rd();o=rd();loc=rd();
u=belong_root[V];//u记录第V个版本到底属于哪颗树
if(o==){
val=rd();
root[++num_root]=++num_treenode;//多了一颗树
Update(num_treenode,root[u],loc,val);
belong_root[++num_version]=num_root;
}
else{
printf("%d\n",Query(root[u],loc));
belong_root[++num_version]=u;
}
}
return ;
}

By:AlenaNuna

Luogu P3919【模板】可持久化数组(可持久化线段树/平衡树)的更多相关文章

  1. luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)

    luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include< ...

  2. 洛谷 P3919 【模板】可持久化数组(可持久化线段树/平衡树)-可持久化线段树(单点更新,单点查询)

    P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...

  3. 洛谷——P3919 【模板】可持久化数组(可持久化线段树/平衡树)

    P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...

  4. Luogu P3919 【模板】可持久化数组 可持久化线段树

    其实就是可持久化线段树的模板题线段树不会看这里 #include<bits/stdc++.h> ; using namespace std; ]; ],rc[N*],val[N*],cnt ...

  5. P3919 【模板】可持久化数组 -初步探究主席树

    本篇blog主要是给自己(大家)看的. 感谢longlongzhu123奆佬(此人初二LCT)的指点,使本蒟蒻可以快速开始主席树入门. what is 主席树? $        $主席树这个名字只不 ...

  6. [Luogu 3919]【模板】可持久化数组(可持久化线段树/平衡树)

    Description 如题,你需要维护这样的一个长度为 N 的数组,支持如下几种操作 在某个历史版本上修改某一个位置上的值 访问某个历史版本上的某一位置的值 此外,每进行一次操作(对于操作2,即为生 ...

  7. 洛谷P3919 【模板】可持久化数组(可持久化线段树/平衡树)

    题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集) 题目描述 如题,你需要维护这样的一个长度为 N 的数组, ...

  8. P3919 【模板】可持久化数组(可持久化线段树/平衡树)

    题目描述 如题,你需要维护这样的一个长度为 N  的数组,支持如下几种操作 在某个历史版本上修改某一个位置上的值 访问某个历史版本上的某一位置的值 此外,每进行一次操作(对于操作2,即为生成一个完全一 ...

  9. LGOJ P3919【模板】可持久化数组(可持久化线段树/平衡树)

    代码 //可持久化线段树 #include <cstdio> using namespace std; struct node { node *Lnode,*Rnode; int val; ...

随机推荐

  1. PL/SQL学习笔记之异常

    一:异常 程序执行过程中出现错误情况被称为异常,主要有两种类型的异常: 系统定义的异常 用户定义的异常 二:系统定义的异常 Exception Oracle Error SQLCODE 描述 ACCE ...

  2. SqlDateTime overflow / SqlDateTime 溢出

    Error - SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM SqlDat ...

  3. windows下vbs脚本隐藏控制台

    每次想写python代码时,都需要打开IDE进行编写,并且需要创建许多小文件.如果使用jupyter就能够直接书写.但是jupyter需要手动通过控制台打开,这不够方便.通过把jupyter note ...

  4. MySQL -- 异步I/O

    linux上,innodb使用异步IO子系统(native AIO)来对数据文件页进行预读和写请求.行为受到参数innodb_use_native_aio控制.默认是开启的,且只是适用于linux平台 ...

  5. Linux内核剖析(一)Linux的历史

    Unix操作系统 Unix的由来 汤普逊和里奇最早是在贝尔实验室开发Unix的,此后的10年,Unix在学术机构和大型企业中得到了广泛的应用,当时的UNIX拥有者AT&T公司以低廉甚至免费的许 ...

  6. python工具 - 从文件名读取特定信息到excel表格

    情景:文件名中包含学号和用户名,其中用户名在前学好在后,学号为2位,如harry33.txt.natasha12.txt. 要求:将多个文件名中的用户名与学号分开并保存到excle中. 代码部分: i ...

  7. Python测试DB2连通性

    Python测试数据库连通性: #!/usr/bin/python27 #encoding: utf-8 import ibm_db import os import sys def find_db( ...

  8. 【iCore1S 双核心板_FPGA】例程八:触发器实验——触发器的使用

    实验现象: 在本实验中,将工程中的D触发器.JK触发器实例化,对应其真值表,用signal对其进行 检验,利用SignaTap II观察分析波形. 核心代码: module D( input CLK, ...

  9. Git 标签操作

    允许有意义的名称到一个特定的版本库中的标签操作.Tom 决定标记他们的项目代码,以便他们以后可以更容易访问. 创建标签 让我们标记当前HEAD使用git tag命令.他提供的标记名称前加上-a选项,使 ...

  10. csharp中DateTime总结-转

    Table of Contents 1 时间格式输出 2 求某天是星期几 3 字符串转换为DateTime 3.1 String->DateTime 的弹性做法 4 计算2个日期之间的天数差 5 ...