您需要維護乙個序列,其中需要提供以下操作:
插入乙個數到序列的第 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)
//view codesplay 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()
模板 可持久化陣列(可持久化線段樹 平衡樹)
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 ...