Tranvick

Treap add

Mar 7th, 2012
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.25 KB | None | 0 0
  1. #pragma comment(linker, "/STACK:65777216")
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <cstdlib>
  5. #include <ctime>
  6. #include <cstdio>
  7. #include <algorithm>
  8. #include <cmath>
  9. #include <vector>
  10. #include <set>
  11. #include <stack>
  12. #include <map>
  13. #include <queue>
  14. #include <string>
  15. #include <memory.h>
  16. #include <iterator>
  17. #define y1 trololoy1
  18. #define y0 trololoy0
  19. #define mem(A,X) memset(A,X,sizeof(A))
  20. #define memo(A) memset(A,0,sizeof(A))
  21. #define forn(I,B) for (int I=1;I<=(B);I++)
  22. #define forg(H,V) for (int H=first[V];h;h=next[H])
  23. #define rep(I,B) for (int I=0;I<(B);I++)
  24. #define labs(X) (((X)>0)?(X):(-(X)))
  25. #define ropen(X) freopen(X,"r",stdin)
  26. #define wopen(X) freopen(X,"w",stdout)
  27. #define rwopen(X) freopen(X".in","r",stdin);freopen(X".out","w",stdout)
  28. #define pb push_back
  29. #define mp make_pair
  30. #define all(X) (X).begin(),(X).end()
  31. #define sqr(X) ((X)*(X))
  32.  
  33. using namespace std;
  34.  
  35. typedef pair <int,int> pii;
  36. typedef double ld;
  37. typedef long long ll;
  38. typedef pair <ll,ll> pll;
  39. typedef vector<int> vi;
  40. const int N=222222;
  41. const int INF=111111111;
  42. const double eps=1e-9;
  43. const double pi=3.14159265358979;
  44.  
  45. struct treap{
  46.     int ls,rs,x,y,cost,sum,add,sz;
  47. } t[N];
  48.  
  49. int c,n,root,a[N],k;
  50.  
  51. inline int sumof(int v){
  52.     return v?t[v].sum+t[v].add*t[v].sz:0;
  53. }
  54.  
  55. inline int szof(int v){
  56.     return v?t[v].sz:0;
  57. }
  58.  
  59. inline void recalc(int v){
  60.     if (!v) return;
  61.     t[v].sum=sumof(t[v].ls)+sumof(t[v].rs)+t[v].cost;
  62.     t[v].sz=szof(t[v].ls)+szof(t[v].rs)+1;
  63. }
  64.  
  65. inline void push(int v){
  66.     if (!t[v].add) return;
  67.     t[v].cost+=t[v].add;
  68.     t[t[v].ls].add+=t[v].add;
  69.     t[t[v].rs].add+=t[v].add;
  70.     t[v].add=0;
  71. }
  72.  
  73. void merge(int & x,int l,int r){
  74.     if (!l || !r){
  75.         x=l?l:r;
  76.         return;
  77.     }
  78.     if (t[l].y>t[r].y){
  79.         x=l;
  80.         push(x);
  81.         merge(t[x].rs,t[x].rs,r);
  82.     } else {
  83.         x=r;
  84.         push(x);
  85.         merge(t[x].ls,l,t[x].ls);
  86.     }
  87.     recalc(x);
  88. }
  89.  
  90. void split(int x,int key,int &l,int &r){
  91.     if (!x){
  92.         l=r=0;
  93.         return;
  94.     }
  95.     push(x);
  96.     if (t[x].x<=key){
  97.         l=x;
  98.         split(t[x].rs,key,t[x].rs,r);
  99.     } else {
  100.         r=x;
  101.         split(t[x].ls,key,l,t[x].ls);
  102.     }
  103.     recalc(x);
  104. }
  105.  
  106. void insert(int &x){
  107.     if (!x){
  108.         x=c;
  109.         return;
  110.     }
  111.     if (t[c].y>t[x].y){
  112.         split(x,t[c].x,t[c].ls,t[c].rs);
  113.         x=c;
  114.     } else insert(t[c].x<t[x].x?t[x].ls:t[x].rs);
  115.     recalc(x);
  116. }
  117.  
  118. inline void ins(int key,int cost){
  119.     t[++c]=(treap){0,0,key,a[c],cost,cost,0,1};
  120.     insert(root);
  121. }
  122.  
  123. void erase(int &x,int key){
  124.     if (!x) return;
  125.     if (t[x].x==key) merge(x,t[x].ls,t[x].rs);
  126.     else erase(t[x].x<key?t[x].rs:t[x].ls,key);
  127.     recalc(x);
  128. }
  129.  
  130. void print(int x){
  131.     if (!x) return;
  132.     print(t[x].ls);
  133.     cout<<t[x].x<<" ";
  134.     print(t[x].rs);
  135. }
  136.  
  137. inline int query(int l,int r){
  138.     int L,M1,M2,R;
  139.     split(root,l-1,L,M1);
  140.     split(M1,r,M2,R);
  141.     int q=sumof(M2);
  142.     merge(M1,M2,R);
  143.     merge(root,L,M1);
  144.     return q;
  145. }
  146.  
  147. inline void add(int l,int r,int x){
  148.     int L,M1,M2,R;
  149.     split(root,l-1,L,M1);
  150.     split(M1,r,M2,R);
  151.     t[M2].add+=x;
  152.     merge(M1,M2,R);
  153.     merge(root,L,M1);
  154. }
  155.  
  156. int main(){
  157.     ropen("input.txt");
  158.     wopen("output.txt");
  159.     cin>>n;
  160.     forn(i,n) a[i]=i;
  161.     random_shuffle(a+1,a+n+1);
  162.     forn(i,n){
  163.         int x;
  164.         scanf("%d",&x);
  165.         ins(i,x);
  166.     }        
  167.     scanf("%d",&n);
  168.     forn(i,n){
  169.         int q,a,b,c;
  170.         scanf("%d%d%d",&q,&a,&b);
  171.         if (!q) scanf("%d",&c);
  172.         if (q) printf("%d\n",query(a,b));
  173.         else add(a,b,c);
  174.     }
  175. }
Advertisement
Add Comment
Please, Sign In to add comment