首页 > 其他分享 >可持久化线段树(主席树)

可持久化线段树(主席树)

时间:2023-04-08 21:36:03浏览次数:37  
标签:node begin 持久 int 线段 tree end top 主席

 

 

 

 

 

 

 

 

 

 

代码

#include<bits/stdc++.h>
using namespace std;
const int N=4e7+10;
int n,m,t,top,rt,mode,x,y;
int f[N],a[N],root[N];
struct kkk{
    int l,r,val;
}tree[N];
int clone(int node){
    top++;
    tree[top]=tree[node];
    return top;
}
int maketree(int node,int begin,int end){
    node=++top;
    if(begin==end){
        tree[node].val=a[begin];
        return top;
    }
    int mid=begin+end>>1;
    tree[node].l=maketree(tree[node].l,begin,mid);
    tree[node].r=maketree(tree[node].r,mid+1,end);
    return node;
}
int update(int node,int begin,int end,int x,int val){
    node=clone(node);
    if(begin==end) tree[node].val=val;
    else{
        int mid=begin+end>>1;
        if(x<=mid) tree[node].l=update(tree[node].l,begin,mid,x,val);
        else tree[node].r=update(tree[node].r,mid+1,end,x,val);
    }
    return node;
}
int query(int node,int l,int r,int x){
    if(l==r) return tree[node].val;
    else{
        int mid=l+r>>1;
        if(x<=mid) return query(tree[node].l,l,mid,x);
        else return query(tree[node].r,mid+1,r,x);
    }
}
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;++i) cin>>a[i];
    root[0]=maketree(0,1,n);
    for(int i=1;i<=m;++i){
        cin>>rt>>mode>>x;
        if(mode==1){
            cin>>y;
            root[i]=update(root[rt],1,n,x,y);
        }
        else{
            cout<<query(root[rt],1,n,x)<<'\n';
            root[i]=root[rt];
        }
    }
    return 0;
}

 

标签:node,begin,持久,int,线段,tree,end,top,主席
From: https://www.cnblogs.com/buleeyes/p/17299270.html

相关文章

  • poj-3367(线段树+区间合并)
    HotelPOJ-3667思路:与hdu-1540(线段树+区间合并)-魏老6-博客园(cnblogs.com)类似,只不过是区间修改,多维护一个最大连续区间sum。#define_CRT_SECURE_NO_WARNINGS1#include<algorithm>#include<fstream>#include<iostream>#include<cstdio>#include<deque>#includ......
  • THM-红队-Windows本地持久性
    篡改非特权帐户分配组成员资格C:\>netlocalgroupadministratorsthmuser0/add这将允许您使用RDP、WinRM或任何其他可用的远程管理服务来访问服务器。如果这看起来太可疑,您可以使用BackupOperators组。该组中的用户没有管理权限,但可以读取/写入系统上的任何文件或注册......
  • hdu-1540(线段树+区间合并)
    TunnelWarfareHDU-1540思路:没被摧毁的村庄为1,否则为0,用len记录线段树维护区间的两个信息:前缀最长1的序列pre后缀最长1的序列suf父节点与左右子节点的关系://lc为左节点,rc为右节点1.若左右结点都不满1,则tr[p].pre=tr[lc].pre,tr[p].suf=tr[rc].suf2.若左节点满1,tr......
  • redis-2,redis持久化
    持久化rdb:snapshot快照,持久化快照aof:appendonlyfile写命令操作全部记录下来RDBrdb持久性以指定的时间间隔,执行数据集的时间点快照,全量快照rbd保存到磁盘的文件就是dump.rdb案例配置文件redis.conf在配置文件中找到snapshotting################################SNA......
  • [蓝桥杯 2021 国 AB] 翻转括号序列(线段树上二分)
    [蓝桥杯2021国AB]翻转括号序列题目描述给定一个长度为\(n\)的括号序列,要求支持两种操作:将\(\left[L_{i},R_{i}\right]\)区间内(序列中的第\(L_{i}\)个字符到第\(R_{i}\)个字符)的括号全部翻转(左括号变成右括号,右括号变成左括号)。求出以\(L_{i}\)为左端点......
  • Redis 持久化机制
    目录Redis数据持久化RDB(RedisDatabase)触发快照的时机AOF(AppendOnlyFile)AOF日志写入过程AOF重写机制AOF重写写时复制AOF重写缓冲区子进程重写的优点总结RDB+AOF组合Redis数据持久化Redis提供了四种持久化策略:RDB(RedisDatabase)、AOF、RDB+AOF和不持久化。RDB......
  • CAD如何测量连续线段长度?CAD测量连续线段长度步骤
    在CAD绘图过程中,经常会绘制一些连续的线段,如果想要知道这些连续线段长度的话,该怎么操作吗?CAD如何测量连续线段长度?下面小编就以浩辰CAD软件为例来给大家分享一下CAD测量连续线段长度的具体操作步骤吧!CAD测量连续线段长度步骤:浩辰CAD软件中已经考虑到了这种需求,在CAD测量命令(DIST......
  • 动态开点线段树&线段树合并学习笔记
    动态开点线段树使用场景\(4\timesn\)开不下。值域需要平移(有负数)。什么时候开点显然,访问的节点不存在时(只会在修改递归时开点)。trick区间里面有负数时,\(mid=(l+R-1)/2\)。防止越界。例如区间\([-1,0]\)。开点上限考虑到update一次最多开\(\logV\)个......
  • Redis持久化RDB和AOF原理解析、使用和优缺点对比
    前言本文讲述Redis两种持久化方式RDB和AOF优缺点以及原理。为何需要持久化?Redis是基于内存操作的,进程终止、服务器宕机后内存数据会丢失,但是在很多使用场景中我们希望数据不丢失,服务重启之后数据还能恢复到停机前的状态,特别是使用Redis做数据库的情况。Redis持久化......
  • 第二十届浙大城市学院程序设计竞赛 I.Magic Tree DFS序线段树
    传送门大致思路:  我们知道dfs序上的整颗子树dfs序编号连续,因为每次删除一个点或者新增一个点都导致子树上所有点的深度加一或者减一。由于是区间修改所以我们考虑dfs序上建线段树。  #include<iostream>#include<cstring>#include<iomanip>#include<algorithm>#in......