可持久化樹模板

2022-05-01 11:33:10 字數 3592 閱讀 4467

您需要維護乙個序列,其中需要提供以下操作:

插入乙個數到序列的第 t 版本使其成為序列的第 k 項,這個數為 x ;

刪除序列的第 t 版本的第 k 項;

查詢序列的第 t 版本的第 k 項。

第 0 個版本為空序列。修改操作不會影響被修改的版本,而總是產生乙個新版本。

input

第一行有乙個正整數 n 表示操作的數量。

接下來 n 行每行第乙個正整數 opt 表示操作的型別,後面有 3 個整數 t,k,x 或 2 個整數 t,k 表示操作的引數。

1 ≤ n ≤ 3×105 , 1 ≤ opt ≤ 3  ,  0 ≤ x < 109 ,保證所有操作合法。

由於資料量較大,可能需要使用特別的讀入方式。

output

對於每個查詢操作輸出一行乙個數,表示查詢的結果。

sample input

17

1 0 1 1

1 1 1 2

1 2 1 3

2 3 2

3 4 2

1 4 3 4

1 5 1 5

3 3 2

1 3 4 6

1 6 3 7

1 7 1 8

3 8 2

3 7 3

2 8 4

2 9 2

3 11 4

3 10 4

sample output

123164

hint

每次操作後的序列如下

1 | 1

2 | 2 1

3 | 3 2 1

4 | 3 1

(=> 1)

5 | 3 1 4

6 | 5 3 1 4

(=> 2)

7 | 3 2 1 6

8 | 5 3 7 1 4

9 | 8 3 2 1 6

(=> 3)

(=> 1)

10 | 5 3 7 4

11 | 8 2 1 6

(=> 6)

(=> 4)

//

splay tree

#include#define ll long long

#define ull unsigned long long

#define scl(i) scanf("%lld", &i)

#define scll(i, j) scanf("%lld %lld", &i, &j)

#define sclll(i, j, k) scanf("%lld %lld %lld", &i, &j, &k)

#define scllll(i, j, k, l) scanf("%lld %lld %lld %lld", &i, &j, &k, &l)

#define scs(i) scanf("%s", i)

#define sci(i) scanf("%d", &i)

#define scd(i) scanf("%lf", &i)

#define scil(i) scanf("%i64d", &i)

#define scii(i, j) scanf("%d %d", &i, &j)

#define scdd(i, j) scanf("%lf %lf", &i, &j)

#define scill(i, j) scanf("%i64d %i64d", &i, &j)

#define sciii(i, j, k) scanf("%d %d %d", &i, &j, &k)

#define scddd(i, j, k) scanf("%lf %lf %lf", &i, &j, &k)

#define scilll(i, j, k) scanf("%i64d %i64d %i64d", &i, &j, &k)

#define sciiii(i, j, k, l) scanf("%d %d %d %d", &i, &j, &k, &l)

#define scdddd(i, j, k, l) scanf("%lf %lf %lf %lf", &i, &j, &k, &l)

#define scillll(i, j, k, l) scanf("%i64d %i64d %i64d %i64d", &i, &j, &k, &l)

#define lson l, m, rt<<1

#define rson m+1, r, rt<<1|1

#define lowbit(i) (i & (-i))

#define mem(i, j) memset(i, j, sizeof(i))

#define fir first

#define sec second

#define vi vector#define ins(i) insert(i)

#define pb(i) push_back(i)

#define pii pair#define vl vector#define mk(i, j) make_pair(i, j)

#define all(i) i.begin(), i.end()

#define pll pair#define _time 0

#define _input 0

#define _output 0clock_t start, end;

void

__sttime();

void

__entime();

void

__ioput();

using

namespace

std;

/*rope

rope(rope&); //建構函式、傳入rope可以用來拷貝

push_back(x); // 在末尾新增x

insert(pos, x); // 在pos插入x

erase(pos, x); // 從pos開始刪除x個

copy(pos, len, x); // 從pos開始到pos+len為止用x代替

replace(pos, x); // 從pos開始換成x

substr(pos, x); // 提取pos開始x個

at(x) / [x]; // 訪問第x個元素

時間複雜度為n*(n^0.5)

*/#include

using

namespace

__gnu_cxx;

const

int maxn = 3e5 + 10

;int

n, id;

rope

*rope[maxn];

int main(void

)

if(op == 2

)

if(op == 3) printf("

%d\n

", rope[t]->at(k-1

)); }

__entime();

return0;}

void

__sttime()

void

__entime()

void

__ioput()

view code

模板 可持久化陣列(可持久化線段樹 平衡樹)

update 最後乙個點時間空間已經放大 標題即題意 有了可持久化陣列,便可以實現很多衍生的可持久化功能 例如 可持久化並查集 如題,你需要維護這樣的乙個長度為 n n n 的陣列,支援如下幾種操作 在某個歷史版本上修改某乙個位置上的值 訪問某個歷史版本上的某一位置的值 此外,每進行一次操作 對於操...

模板 可持久化線段樹

大神講解下終於理解了可持久化和區間第 k大數的關係。終於理解了權值線段樹是什麼。權值線段樹 例 1 1 2 7 9 11 一串數列,權值線段樹里的 線段 指 有序數列 裡的 一段區間 一般統計的是 乙個數 乙個區間裡的數 的出現次數。以一次插入為乙個歷史狀態 應用線段樹的結構穩定性 建好後結構不變。...

模板 可持久化字典樹

made by xiper updata time 2015 12 8 test status 使用前呼叫初始化函式 init 同時 root 0 0 struct trie persistent tree triesize 獲取字符集雜湊編號 必須在 0 lettersize 之內 inline ...