knightL

F

Jun 25th, 2011
339
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.10 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <ctime>
  3. #include <stdlib.h>
  4. #include <vector>
  5. #include <iostream>
  6. #include <algorithm>
  7. using namespace std;
  8. typedef struct node* pnode;
  9. typedef long long ll;
  10. struct key
  11. {
  12.     ll val,s;
  13.     int v;
  14.     ll a,d;
  15.     key(){}
  16.     key(int _val)
  17.     {
  18.         val=_val;
  19.         s=_val;
  20.         v=-1;
  21.         a=0;
  22.         d=0;
  23.     }
  24. };
  25.  
  26. struct node
  27. {
  28.     key k;
  29.     int p;
  30.     int cnt;
  31.     pnode l,r;
  32.     node()
  33.     {}
  34.     node(int _val): k(_val)
  35.     {
  36.         p=rand();
  37.         cnt=1;
  38.         l=NULL;
  39.         r=NULL;
  40.     }
  41. };
  42.  
  43. int count(pnode cur)
  44. {
  45.     return cur? cur->cnt:0;
  46. }
  47.  
  48. ll getsum(pnode cur)
  49. {
  50.     return cur? cur->k.s:0;
  51. }
  52.  
  53. void recalc(pnode cur)
  54. {
  55.     cur->cnt=count(cur->l)+count(cur->r)+1;
  56.     cur->k.s=getsum(cur->l)+getsum(cur->r)+cur->k.val;
  57. }
  58.  
  59.  
  60.  
  61. void push(pnode cur)
  62. {
  63.     if(cur!=NULL)
  64.     {
  65.         key *k=&cur->k;
  66.         ll tmp_a0,tmp_d;
  67.         if(k->v!=-1)
  68.         {
  69.             k->val=k->v;
  70.             if(cur->l)
  71.             {
  72.                 cur->l->k.v=k->v;
  73.                 cur->l->k.a=0;
  74.                 cur->l->k.d=0;
  75.                 cur->l->k.s=cur->l->cnt*k->v;
  76.             }
  77.             if(cur->r)
  78.             {
  79.                 cur->r->k.v=k->v;
  80.                 cur->r->k.a=0;
  81.                 cur->r->k.d=0;
  82.                 cur->r->k.s=cur->r->cnt*k->v;
  83.             }
  84.         }
  85.         k->v=-1;
  86.         if(k->a||k->d)
  87.         {
  88.             int curindex=count(cur->l)+1;
  89.             k->val+=k->a+k->d*(curindex-1);
  90.             if(cur->l)
  91.             {
  92.                 tmp_a0=k->a;
  93.                 tmp_d=k->d;
  94.                 cur->l->k.a+=tmp_a0;
  95.                 cur->l->k.d+=tmp_d;
  96.                 cur->l->k.s+=(tmp_a0+tmp_a0+tmp_d*(cur->l->cnt-1))*(cur->l->cnt)/2;
  97.             }
  98.             if(cur->r)
  99.             {
  100.                 tmp_a0=k->a+k->d*(curindex);
  101.                 tmp_d=k->d;
  102.                 cur->r->k.a+=tmp_a0;
  103.                 cur->r->k.d+=tmp_d;
  104.                 cur->r->k.s+=(tmp_a0+tmp_a0+tmp_d*(cur->r->cnt-1))*(cur->r->cnt)/2;
  105.             }
  106.         }
  107.         k->a=0;
  108.         k->d=0;
  109.     }
  110. }
  111.  
  112. void split(pnode c,pnode &l,pnode &r,int k)
  113. {
  114.     push(c);
  115.     if(c==NULL)
  116.     {
  117.         l=NULL;
  118.         r=NULL;
  119.         return;
  120.     }
  121.  
  122.     int curidx=count(c->l)+1;
  123.     if(curidx<=k)
  124.     {
  125.         split(c->r,c->r,r,k-curidx);
  126.         l=c;
  127.         recalc(l);
  128.     }
  129.     else
  130.     {
  131.         split(c->l,l,c->l,k);
  132.         r=c;
  133.         recalc(r);
  134.     }
  135. }
  136.  
  137. void merge(pnode &res,pnode l,pnode r)
  138. {
  139.     push(l);
  140.     push(r);
  141.     if(l==NULL)
  142.     {
  143.         res=r;
  144.     }
  145.     else if(r==NULL)
  146.     {
  147.         res=l;
  148.     }
  149.     else if(l->p>r->p)
  150.     {
  151.         merge(l->r,l->r,r);
  152.         res=l;
  153.  
  154.     }
  155.     else
  156.     {
  157.         merge(r->l,l,r->l);
  158.         res=r;
  159.     }
  160.     recalc(res);
  161. }
  162.  
  163. int main()
  164. {
  165.     srand(time(0));
  166.     int i,j,v;
  167.     int N,Q;
  168.     int t;
  169.     pnode root=NULL,tmp,l,c,r;
  170.     scanf("%d%d",&N,&Q);
  171.     for(int i=0;i<N;i++)
  172.     {
  173.         scanf("%d",&t);
  174.         tmp=new node(t);
  175.         merge(root,root,tmp);
  176.     }
  177.     while(Q--)
  178.     {
  179.         scanf("%d",&i);
  180.         switch(i)
  181.         {
  182.         case 1:
  183.             scanf("%d%d%d",&i,&j,&v);
  184.             split(root,l,r,j);
  185.             split(l,l,c,i-1);
  186.             c->k.v=v;
  187.             c->k.s=c->cnt*v;
  188.             c->k.a=0;
  189.             c->k.d=0;
  190.             merge(l,l,c);
  191.             merge(root,l,r);
  192.             break;
  193.         case 2:
  194.             scanf("%d%d%d",&i,&j,&v);
  195.             split(root,l,r,j);
  196.             split(l,l,c,i-1);
  197.             c->k.s+=v*c->cnt*(c->cnt+1)/2;
  198.             c->k.a+=v;
  199.             c->k.d+=v;
  200.             merge(l,l,c);
  201.             merge(root,l,r);
  202.             break;
  203.         case 3:
  204.             scanf("%d%d",&i,&j);
  205.             split(root,l,r,i-1);
  206.             c=new node (j);
  207.             merge(l,l,c);
  208.             merge(root,l,r);
  209.             break;
  210.         case 4:
  211.             scanf("%d%d",&i,&j);
  212.             split(root,l,r,j);
  213.             split(l,l,c,i-1);
  214.             printf("%lld\n",getsum(c));
  215.             merge(l,l,c);
  216.             merge(root,l,r);
  217.             break;
  218.         }
  219.     }
  220.     return 0;
  221. }
Advertisement
Add Comment
Please, Sign In to add comment