[Luogu 3919]【模板】可持久化数组(可持久化线段树/平衡树)
Description
如题,你需要维护这样的一个长度为 N 的数组,支持如下几种操作
在某个历史版本上修改某一个位置上的值
- 访问某个历史版本上的某一位置的值
此外,每进行一次操作(对于操作2,即为生成一个完全一样的版本,不作任何改动),就会生成一个新的版本。版本编号即为当前操作的编号(从1开始编号,版本0表示初始状态数组)
Input
输入的第一行包含两个正整数 N, M, 分别表示数组的长度和操作的个数。
第二行包含N个整数,依次为初始状态下数组各位的值(依次为 a_i,1≤i≤N)。
接下来M行每行包含3或4个整数,代表两种操作之一(ii为基于的历史版本号):
对于操作1,格式为vi 1 loci valuei,即为在版本v_ivi的基础上,将 aloci 修改为 valuei
- 对于操作2,格式为vi 2 loci ,即访问版本 vi 中的 aloci 的值
Output
输出包含若干行,依次为每个操作2的结果。
Sample Input
5 10
59 46 14 87 41
0 2 1
0 1 1 14
0 1 1 57
0 1 1 88
4 2 4
0 2 5
0 2 4
4 2 1
2 2 2
1 1 5 91
Sample Output
59
87
41
87
88
46
HINT
数据规模:
对于30%的数据:1≤N,M≤103
对于50%的数据:1≤N,M≤104
对于70%的数据:1≤N,M≤105
对于100%的数据:1≤N,M≤106,1≤loci≤N,0≤vi<i,−109≤ai,valuei≤109
经测试,正常常数的可持久化数组可以通过,请各位放心
数据略微凶残,请注意常数不要过大
另,此题I/O量较大,如果实在TLE请注意I/O优化
样例说明:
一共11个版本,编号从0-10,依次为:
0 : 59 46 14 87 41
1 : 59 46 14 87 41
2 : 14 46 14 87 41
3 : 57 46 14 87 41
4 : 88 46 14 87 41
5 : 88 46 14 87 41
6 : 59 46 14 87 41
7 : 59 46 14 87 41
8 : 88 46 14 87 41
9 : 14 46 14 87 41
- 10 : 59 46 14 87 91
题解
$rt$,当模板存着...
//It is made by Awson on 2017.10.3
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define LL long long
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define sqr(x) ((x)*(x))
#define insert INSERT
using namespace std;
const int N = 1e6;
void read(int &x) {
char ch; bool flag = ;
for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || ); ch = getchar());
for (x = ; isdigit(ch); x = (x<<)+(x<<)+ch-, ch = getchar());
x *= -*flag;
} struct node {
int key;
node *child[];
}sgm[N*+], *pos = sgm;
node* root[N+];
int n, m, a[N+];
int opt, v, loc, val; void build(node *o, int l, int r) {
if (l == r) {
o->key = a[l];
return;
}
int mid = (l+r)>>;
o->child[] = ++pos; build(o->child[], l, mid);
o->child[] = ++pos; build(o->child[], mid+, r);
}
void insert(node* &o, int l, int r, int loc, int val) {
node* tmp = o;
o = ++pos;
if (l == r) {
o->key = val;
return;
}else {
o->child[] = tmp->child[];
o->child[] = tmp->child[];
}
int mid = (l+r)>>;
if (loc <= mid) insert(o->child[], l, mid, loc, val);
else insert(o->child[], mid+, r, loc, val);
}
int query(node *o, int l, int r, int loc) {
if (l == r) return o->key;
int mid = (l+r)>>;
if (loc <= mid) return query(o->child[], l, mid, loc);
else return query(o->child[], mid+, r, loc);
}
void work() {
read(n), read(m);
for (int i = ; i <= n; i++) read(a[i]);
root[] = pos;
build(root[], , n);
for (int i = ; i <= m; i++) {
read(v), read(opt);
if (opt == ) {
read(loc), read(val);
root[i] = root[v];
insert(root[i], , n, loc, val);
}
else {
read(loc);
root[i] = root[v];
printf("%d\n", query(root[i], , n, loc));
}
}
}
int main() {
work();
return ;
}
[Luogu 3919]【模板】可持久化数组(可持久化线段树/平衡树)的更多相关文章
- luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)
luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include< ...
- Luogu P3919【模板】可持久化数组(可持久化线段树/平衡树)
题面:[模板]可持久化数组(可持久化线段树/平衡树) 不知道说啥,总之我挺喜欢自己打的板子的! #include<cstdio> #include<cstring> #incl ...
- 洛谷 P3919 【模板】可持久化数组(可持久化线段树/平衡树)-可持久化线段树(单点更新,单点查询)
P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...
- 洛谷——P3919 【模板】可持久化数组(可持久化线段树/平衡树)
P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集 ...
- Luogu P3919 【模板】可持久化数组 可持久化线段树
其实就是可持久化线段树的模板题线段树不会看这里 #include<bits/stdc++.h> ; using namespace std; ]; ],rc[N*],val[N*],cnt ...
- P3919 【模板】可持久化数组 -初步探究主席树
本篇blog主要是给自己(大家)看的. 感谢longlongzhu123奆佬(此人初二LCT)的指点,使本蒟蒻可以快速开始主席树入门. what is 主席树? $ $主席树这个名字只不 ...
- 洛谷P3919 【模板】可持久化数组(可持久化线段树/平衡树)
题目背景 UPDATE : 最后一个点时间空间已经放大 标题即题意 有了可持久化数组,便可以实现很多衍生的可持久化功能(例如:可持久化并查集) 题目描述 如题,你需要维护这样的一个长度为 N 的数组, ...
- P3919 【模板】可持久化数组(可持久化线段树/平衡树)
题目描述 如题,你需要维护这样的一个长度为 N 的数组,支持如下几种操作 在某个历史版本上修改某一个位置上的值 访问某个历史版本上的某一位置的值 此外,每进行一次操作(对于操作2,即为生成一个完全一 ...
- LGOJ P3919【模板】可持久化数组(可持久化线段树/平衡树)
代码 //可持久化线段树 #include <cstdio> using namespace std; struct node { node *Lnode,*Rnode; int val; ...
随机推荐
- 弹幕视频播放app案例分析
产品 哔哩哔哩动画 相对于其他视频播放软件来说,哔哩哔哩动画没有广告影响观看体验,而且内容更偏重于二次元,因此我更倾向于使用它. 第一部分 调研, 评测 #第一次上手体验 用起来还是比较方便,可以快速 ...
- 技术文档分享_linux中生成考核用的GPT分区表结构修复
注:历史版本,后期改用python实现了 实验一: 目的:用于生成大量模拟破坏GPT分区结构案例,并生成唯一方式修复后的评判方法.故障:在一个完整的GPT分区磁盘上,丢失了GPT主分区表,或备份分区表 ...
- .net mvc 利用分部视图局部刷新.
页面利于$.Ajax: $(function(){ $("#btnpartview").click(function () { var model = []; model.push ...
- JS判断不同操作系统显示不同样式css
<script type="text/javascript"> var system ={}; var p = navigator.platform; //判断是否为P ...
- 初学者如何查阅自然语言处理(NLP)领域学术资料
1. 国际学术组织.学术会议与学术论文 自然语言处理(natural language processing,NLP)在很大程度上与计算语言学(computational linguistics,CL ...
- mybatis的mapper接口代理使用的三个规范
1.什么是mapper代理接口方式? MyBatis之mapper代理方式.mapper代理使用的是JDK的动态代理策略 2.使用mapper代理方式有什么好处 使用这种方式可以不用写接口的实现类,免 ...
- JS 实现MVC的写法
案例:当select 下拉选择框值变化时,显示其值(不是文本) 常规写法 <h3>JavaScript no MVC</h3> <div> <selec ...
- Netty事件监听和处理(上)
陪产假结束了,今天又开始正常上班了,正好赶上米粉节活动,又要忙上一阵了,米粉节活动时间为4.03 - 4.10,有不少优惠,感兴趣的可以关注mi.com或小米商城app. 今天给大家送了福利:小爱音箱 ...
- 新概念英语(1-123)A trip to Australia
Who is the man with the beard?(胡须)A:Look, Scott. This is a photograph I took during my trip to Austr ...
- 详解Ajax请求(三)——jQuery对Ajax的实现及serialize()函数对于表单域控件参数提交的使用技巧
原生的Ajax对于异步请求的实现并不好用,特别是不同的浏览器对于Ajax的实现并不完全相同,这就意味着你使用原生的Ajax做异步请求要兼顾浏览器的兼容性问题,对于java程序员来讲这是比较头疼的事情, ...