Advertisement
Guest User

Untitled

a guest
Dec 27th, 2018
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.87 KB | None | 0 0
  1. #pragma GCC optimize("O3")
  2. #include<bits/stdc++.h>
  3. #define rc(x) return cout<<x<<endl,0
  4. #define pb push_back
  5. #define in insert
  6. #define er erase
  7. #define fd find
  8. #define fr first
  9. #define sc second
  10. typedef long long ll;
  11. typedef long double ld;
  12. const ll INF=0x3f3f3f3f3f3f3f3f;
  13. const ll llinf=(1LL<<61);
  14. const int inf=(1<<30);
  15. const int nmax=5e5+50;
  16. const int mod=1e9+7;
  17. using namespace std;
  18. int n,i,a[nmax],st[10*20*nmax],lch[10*20*nmax],rch[10*20*nmax],q,t,x,y,nds,r,rt[nmax],v,rev;
  19. int nlf(int x)
  20. {
  21. int p=++nds;
  22. lch[p]=rch[p]=0;
  23. st[p]=x;
  24. return p;
  25. }
  26. int npr(int l,int r)
  27. {
  28. int p=++nds;
  29. lch[p]=l,rch[p]=r;
  30. st[p]=st[l]+st[r];
  31. return p;
  32. }
  33. int build(int l,int r)
  34. {
  35. if(l==r)return nlf(a[l]);
  36. int mid=(l+r)/2;
  37. return npr(build(l,mid),build(mid+1,r));
  38. }
  39. int upd(int nod,int l,int r,int p)
  40. {
  41. if(l==r)return nlf(a[l]);
  42. int mid=(l+r)/2;
  43. if(p<=mid)return npr(upd(lch[nod],l,mid,p),rch[nod]);
  44. else return npr(lch[nod],upd(rch[nod],mid+1,r,p));
  45. }
  46. int qry(int nod,int l,int r,int tl,int tr)
  47. {
  48. if(tr<l || tl>r)return 0;
  49. if(tl<=l && r<=tr)return st[nod];
  50. int mid=(l+r)/2;
  51. int v=0;
  52. if(tl<=mid)v=qry(lch[nod],l,mid,tl,tr);
  53. if(tr>mid)v+=qry(rch[nod],mid+1,r,tl,tr);
  54. return v;
  55. }
  56. int rngcpy(int nod,int l,int r,int old,int tl,int tr)
  57. {
  58. if(l>tr || r<tl)return nod;
  59. if(tl<=l && r<=tr)return old;
  60. int mid=(l+r)/2;
  61. return npr(rngcpy(lch[nod],l,mid,lch[old],tl,tr),rngcpy(rch[nod],mid+1,r,rch[old],tl,tr));
  62. }
  63. int main()
  64. {
  65. //freopen("sol.in","r",stdin);
  66. //freopen("sol.out","w",stdout);
  67. ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0);
  68. cin>>n;
  69. for(i=1;i<=n;i++)cin>>a[i];
  70. rt[++r]=build(1,n);
  71. cin>>q;
  72. while(q--)
  73. {
  74. cin>>t>>x>>y>>v;
  75. if(t==1)
  76. {
  77. rev=rngcpy(rt[r],1,n,rt[x+1],1,n);
  78. a[y]+=v;
  79. rt[++r]=upd(rev,1,n,y);
  80. }
  81. else cout<<qry(rt[x+1],1,n,y,v)<<endl;
  82. }
  83. return 0;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement