Advertisement
jeff69

Untitled

May 8th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.85 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MX = 1e5+69;
  4. typedef long long ll;
  5. int S[MX],n,q,idblock[MX];
  6. struct block
  7. {
  8.     ll Storage,Init;
  9.     vector<int> v,sv;
  10.     void insert(int x)
  11.     {
  12.         v.push_back(x);
  13.         Storage+=S[x];
  14.         sv.push_back(0);
  15.     }
  16.     void emptyall()
  17.     {
  18.         for(int i=0;i<sv.size();i++)
  19.             sv[i]=0;
  20.     }
  21.     void pourright(int,int);
  22.     void pourleft(int,int);
  23.     void emptyright(int x)
  24.     {
  25.         for(int i=0;i<v.size();i++)
  26.         {
  27.             if(v[i]<x)continue;
  28.             Init-=sv[i];
  29.             sv[i]=0;
  30.         }
  31.     }
  32.     void emptyleft(int x)
  33.     {
  34.         for(int i=(int)v.size()-1;i>=0;i--)
  35.         {
  36.             if(v[i]>x)continue;
  37.             Init-=sv[i];
  38.             sv[i]=0;
  39.         }
  40.     }
  41.     void emptyinterval(int l,int r)
  42.     {
  43.         for(int i=0;i<v.size();i++)
  44.         {
  45.             if(v[i]>=l&&v[i]<=r)
  46.             {
  47.                 Init-=sv[i];
  48.                 sv[i]=0;
  49.             }
  50.         }
  51.     }
  52.     int getval(int x)
  53.     {
  54.         if(Init==0)emptyall();
  55.         for(int i=0;i<v.size();i++)
  56.         {
  57.             if(v[i]==x)
  58.                 return sv[i];
  59.         }
  60.         assert(0);
  61.     }
  62. } b[333];
  63. void block:: pourright(int x,int y)
  64.     {
  65.         if(Init==0)emptyall();
  66.         for(int i=0;i<v.size();i++)
  67.         {
  68.             int u = v[i];
  69.             if(u<x)continue;
  70.             int last = sv[i];
  71.             int zb = S[u]-sv[i];
  72.             zb=min(zb,y);
  73.             sv[i]+=zb;
  74.             y-=sv[i]-last;
  75.             Init+=sv[i]-last;
  76.         }
  77.         int id=-1;
  78.         for(int i=idblock[x]+1;i<=n/333;i++)
  79.         {
  80.             if(Storage<=y)
  81.             {
  82.                 ll last = b[i].Init;
  83.                 b[i].Init=min(b[i].Storage,1ll*y);
  84.                 y-=b[i].Init-last;
  85.             }
  86.             else
  87.             {
  88.                 id = i;
  89.                 break;
  90.             }
  91.         }
  92.         if(id!=-1)
  93.         b[id].pourright(0,y);
  94.     }
  95. void block:: pourleft(int x,int y)
  96.      {
  97.         if(Init==0)emptyall();
  98.         for(int i=(int)v.size()-1;i>=0;i--)
  99.         {
  100.             int u = v[i];
  101.             if(u>x)continue;
  102.             int last = sv[i];
  103.             int zb = S[u]-sv[i];
  104.             zb=min(zb,y);
  105.             sv[i]+=zb;
  106.             y-=sv[i]-last;
  107.             Init+=sv[i]-last;
  108.         }
  109.         int id=-1;
  110.         for(int i=idblock[x]-1;i>=0;i--)
  111.         {
  112.             if(Storage<=y)
  113.             {
  114.                 ll last = b[i].Init;
  115.                 b[i].Init=min(b[i].Storage,1ll*y);
  116.                 y-=b[i].Init-last;
  117.             }
  118.             else
  119.             {
  120.                 id = i;
  121.                 break;
  122.             }
  123.         }
  124.         if(id!=-1)
  125.         b[id].pourleft(1e6,y);
  126.     }
  127. void emptytheniggas(int l,int r)
  128. {
  129.    int id1=idblock[l],id2=idblock[r];
  130.    if(id1==id2)
  131.    {
  132.        return b[id1].emptyinterval(l,r);
  133.    }
  134.     b[id1].emptyright(l);
  135.     b[id2].emptyleft(r);
  136.     for(int i=id1+1;i<=id2-1;i++)
  137.         b[i].Init=0;
  138. }
  139.  
  140. int main()
  141. {
  142.     cin>>n>>q;
  143.  
  144.     for(int i=1;i<=n;i++)
  145.     {
  146.         scanf("%d",S+i);
  147.         b[i/333].insert(i);
  148.        idblock[i]=i/333;
  149.     }
  150.    // return 0;
  151.     for(int i=1;i<=q;i++)
  152.     {
  153.         int t;
  154.         scanf("%d",&t);
  155.         if(t==1)
  156.         {
  157.             int x,y;
  158.             scanf("%d%d",&x,&y);
  159.             b[idblock[x]].pourleft(x,y);
  160.         }else if(t==2)
  161.         {
  162.             int x,y;
  163.             scanf("%d%d",&x,&y);
  164.             b[idblock[x]].pourright(x,y);
  165.         }
  166.         else if(t==3)
  167.         {
  168.             int x,y;
  169.             scanf("%d%d",&x,&y);
  170.             emptytheniggas(x,y);
  171.         }
  172.         else
  173.         {
  174.             int x;
  175.             scanf("%d",&x);
  176.             printf("%d\n",b[idblock[x]].getval(x));
  177.         }
  178.     }
  179.     return 0;
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement