可持久化数据结构

时间:2021-01-19 10:42:29

可持久化数据结构

题目链接:http://acm.xidian.edu.cn/problem.php?id=1181

用vector实现可持久化

这题要求的是一个支持区间查询的可持久化数据结构。这里使用vector巧妙地实现:pair<time,value>用pair存储时间戳以及当前时间的值,query的时候使用二分查找即可。

代码如下:

 1 #include<cstdio>
 2 #include<vector>
 3 #include<iostream>
 4 #include<algorithm>
 5 #define X first
 6 #define Y second
 7 #define N 1000005
 8 using namespace std;
 9 typedef pair<int,int> P;
10 int n,q,times,type,c,arr[N];
11 vector<P>a[N];
12 vector<P>::iterator it;
13 int lowbit(int x){
14     return x&-x;
15 }
16 int query(int l,int r,int t){
17     int ans=0;
18     for(int i=r;i>0;i-=lowbit(i)){
19         it=upper_bound(a[i].begin(),a[i].end(),make_pair(t,0));
20         if(it!=a[i].end()&&it->X==t)ans+=it->Y;
21         else if(it!=a[i].begin()){
22             it--;
23             ans+=it->Y;
24         }
25     }
26     for(int i=l-1;i>0;i-=lowbit(i)){
27         it=upper_bound(a[i].begin(),a[i].end(),make_pair(t,0));
28         if(it!=a[i].end()&&it->X==t)ans-=it->Y;
29         else if(it!=a[i].begin()){
30             it--;
31             ans-=it->Y;
32         }
33     }
34     return ans;
35 }
36 void add(int index,int addition){
37     int pre;
38     for(int i=index;i<=n;i+=lowbit(i)){
39         if(a[i].empty())pre=0;
40         else pre=a[i].back().Y;
41         a[i].push_back(make_pair(times,pre+addition));
42     }
43 }
44 int main(void){
45     scanf("%d%d",&n,&q);
46     while(q--){
47         scanf("%d",&type);
48         if(type==1){
49             times++;
50             int i,x;
51             scanf("%d%d",&i,&x);
52             add(i^c,x);
53             arr[i^c]+=x;
54             c=arr[i^c];
55         }else if(type==2){
56             int l,r,t;
57             scanf("%d%d%d",&l,&r,&t);
58             c=query(l^c,r^c,t);
59             printf("%d\n",c);
60         }
61     }
62 }