可持久化樹模板

來源:互聯網
上載者:User

標籤:printf   圖片   freopen   play   main   make   eof   sizeof   tle   

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

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

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

  3. 查詢序列的第 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

1
2
3
1
6
4

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<bits/stdc++.h>#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<int>#define ins(i) insert(i)#define pb(i) push_back(i)#define pii pair<int, int>#define VL vector<long long>#define mk(i, j) make_pair(i, j)#define all(i) i.begin(), i.end()#define pll pair<long long, long long>#define _TIME 0#define _INPUT 0#define _OUTPUT 0clock_t START, END;void __stTIME();void __enTIME();void __IOPUT();using namespace std;/*roperope(rope&); //建構函式、傳入rope可以用來拷貝push_back(x); // 在末尾添加xinsert(pos, x); // 在pos插入xerase(pos, x); // 從pos開始刪除x個copy(pos, len, x); // 從pos開始到pos+len為止用x代替replace(pos, x); // 從pos開始換成xsubstr(pos, x); // 提取pos開始x個at(x) / [x]; // 訪問第x個元素時間複雜度為n*(n^0.5)*/#include <ext/rope>using namespace __gnu_cxx;const int maxn = 3e5 + 10;int n, id;rope<int> * Rope[maxn];int main(void){__stTIME();__IOPUT();    int n;    sci(n);    Rope[0] = new rope<int>();    while(n--){        int op, t, k, x;        sciii(op, t, k);        if(op == 1){            sci(x);            Rope[++id] = new rope<int>(*Rope[t]);            Rope[id]->insert(k - 1, x);        }        if(op == 2){            Rope[++id] = new rope<int>(*Rope[t]);            Rope[id]->erase(k - 1, 1);        }        if(op == 3) printf("%d\n", Rope[t]->at(k-1));    }__enTIME();return 0;}void __stTIME(){    #if _TIME        START = clock();    #endif}void __enTIME(){    #if _TIME        END = clock();        cerr<<"execute time = "<<(double)(END-START)/CLOCKS_PER_SEC<<endl;    #endif}void __IOPUT(){    #if _INPUT        freopen("in.txt", "r", stdin);    #endif    #if _OUTPUT        freopen("out.txt", "w", stdout);    #endif}
View Code

 

可持久化樹模板

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.