Matrix_code

data-structure - Rip-Van-Winkle

Jul 1st, 2017 (edited)
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.56 KB | None | 0 0
  1. /*
  2.  * DATE : 2017-07-01
  3.  * Algo :
  4. */
  5. #include<bits/stdc++.h>
  6. using namespace std;
  7. /*------- Constants---- */
  8.  
  9. #define Long                    long long
  10. #define Ulong                   unsigned long long
  11. #define FOR(I,A,B)              for(long long i=0; i < n ; i++ )
  12. #define REP(i,n)                for(long long i=0; i < n ; i++ )
  13. #define mp                      make_pair
  14. #define pb                      push_back
  15. #define all(x)                  (x).begin(),(x).end()
  16. #define PI                      acos(-1.0)
  17. #define EPS                     1e-9
  18. #define F                       first
  19. #define S                       second
  20. #define di(x)                   int x; input(x)
  21. #define in(x)                   input(x)
  22. #define in2(x,y)                in(x),in(y)
  23. #define in3(x,y,z)              in(x),in2(y,z)
  24. #define lc                      ((n)<<1)
  25. #define rc                      ((n)<<1|1)
  26. #define db(x)                   cout << #x << " -> " << x << endl;
  27. #define ms(ara_name,value)      memset(ara_name,value,sizeof(ara_name))
  28. #define IO                      ios_base::sync_with_stdio(0);cin.tie(0)
  29. #define READ                    freopen("in.txt","r",stdin)
  30. #define WRITE                   freopen("out.txt","w",stdout)
  31. template<class T> inline void input(T &x) {
  32.     register char c = getchar();x = 0;
  33.     int neg = 0;
  34.     for(; ((c<48 || c>57) && c != '-'); c = getchar());
  35.     if(c=='-'){neg = 1;c = getchar();}
  36.     for(; c>47 && c<58 ; c = getchar()){x = (x<<1) + (x<<3) + c - 48;}
  37.     if(neg) x = -x;
  38. }
  39. inline long long bigmod(long long p,long long e,long long M){
  40.     long long ret = 1;
  41.     for(; e > 0; e >>= 1){
  42.         if(e & 1) ret = (ret * p) % M;
  43.         p = (p * p) % M;
  44.     } return ret;
  45. }
  46. template <class T> inline T gcd(T a,T b){if(b==0)return a;return gcd(b,a%b);}
  47. template <class T> inline T modinverse(T a,T M){return bigmod(a,M-2,M);}
  48.  
  49. /***************************** END OF TEMPLATE *******************************/
  50. const int N = 250005;
  51. long long T[5*N], P[5*N],C[5*N], V[5*N];
  52. long long calc(long long  x,long long y)
  53. {
  54.     return y*(y+1)/2 - (x*(x-1)/2);
  55. }
  56. void upd(int n,int b,int e,int i,int j,int k,long long s)
  57. {
  58.     if(C[n] != C[0]) {
  59.         V[n] = (e-b+1) * C[n];
  60.         if(b!=e) {
  61.             T[lc] = T[rc] = 0;
  62.             P[lc] = P[rc] = 0;
  63.             C[lc] = C[rc] = C[n];
  64.         }
  65.         C[n] = C[0];
  66.     }
  67.     if(T[n] || P[n]) {
  68.         V[n] += calc(b,e) * T[n] + (e-b+1) *  P[n];
  69.         if(b !=e) {
  70.             T[lc] += T[n];
  71.             T[rc] += T[n];
  72.             P[lc] += P[n];
  73.             P[rc] += P[n];
  74.         }
  75.         P[n] = 0;
  76.         T[n] = 0;
  77.     }
  78.     if(b>j||e<i) return;
  79.     if(b>=i&&e<=j){
  80.         if(k==0){
  81.             V[n] = (e-b+1) * s;
  82.             if(b!=e) {
  83.                 T[lc] = T[rc] = 0;
  84.                 P[lc] = P[rc] = 0;
  85.                 C[lc] = C[rc] = s;
  86.             }
  87.         }
  88.         else {
  89.             V[n] += k * calc(b,e) + (e-b+1) * s;
  90.             if(b !=e ) {
  91.                 T[lc] += k;
  92.                 T[rc] += k;
  93.                 P[lc] += s;
  94.                 P[rc] += s;
  95.             }
  96.         }
  97.         return;
  98.     }
  99.     int mid = (b+e)/2;
  100.     upd(lc,b,mid,i,j,k,s);
  101.     upd(rc,mid+1,e,i,j,k,s);
  102.     V[n] = V[lc] + V[rc];
  103.  
  104. }
  105.  
  106. long long query(int n,int b,int e,int i,int j)
  107. {
  108.     if(C[n] != C[0]) {
  109.         V[n] = (e-b+1) * C[n];
  110.         if(b!=e) {
  111.             T[lc] = T[rc] = 0;
  112.             P[lc] = P[rc] = 0;
  113.             C[lc] = C[rc] = C[n];
  114.         }
  115.         C[n] = C[0];
  116.     }
  117.     if(T[n] || P[n]) {
  118.         V[n] += calc(b,e) * T[n] + (e-b+1) *  P[n];
  119.         if(b !=e) {
  120.             T[lc] += T[n];
  121.             T[rc] += T[n];
  122.             P[lc] += P[n];
  123.             P[rc] += P[n];
  124.         }
  125.         P[n] = 0;
  126.         T[n] = 0;
  127.     }
  128.     if(b>j||e<i) return 0;
  129.     if(b>=i&&e<=j) return V[n];
  130.     int mid = (b+e)/2;
  131.     return query(lc,b,mid,i,j) + query(rc,mid+1,e,i,j);
  132. }
  133. long long A[N];
  134. int main()
  135. {
  136.     ms(C,63);
  137.     int n = 250000,l,r,q,v,cs = 0;
  138.     char ch;
  139.     di(t);
  140.     while(t--) {
  141.         in(q);
  142.         printf("Case %d:\n",++cs);
  143.         for(int i=0;i<q;i++){
  144.  
  145.             scanf(" %c %d %d ",&ch,&l,&r);
  146.             if(ch == 'A') upd(1,1,n,l,r,1,-(l-1));
  147.  
  148.             else if(ch =='B') upd(1,1,n,l,r,-1,(r+1));
  149.  
  150.             else if(ch=='C'){
  151.                 scanf(" %d ",&v);
  152.                 upd(1,1,n,l,r,0,v);
  153.             }
  154.             else if(ch=='S') printf("%lld\n", query(1,1,n,l,r));
  155.         }
  156.         ms(T,0);
  157.         ms(C,63);
  158.         ms(P,0);
  159.         ms(V,0);
  160.         ms(A,0);
  161.  
  162.     }
  163.     return 0;
  164. }
Add Comment
Please, Sign In to add comment