Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- const int MX = 1e5+69;
- typedef long long ll;
- int S[MX],n,q,idblock[MX];
- struct block
- {
- ll Storage,Init;
- vector<int> v,sv;
- void insert(int x)
- {
- v.push_back(x);
- Storage+=S[x];
- sv.push_back(0);
- }
- void emptyall()
- {
- for(int i=0;i<sv.size();i++)
- sv[i]=0;
- }
- void pourright(int,int);
- void pourleft(int,int);
- void emptyright(int x)
- {
- for(int i=0;i<v.size();i++)
- {
- if(v[i]<x)continue;
- Init-=sv[i];
- sv[i]=0;
- }
- }
- void emptyleft(int x)
- {
- for(int i=(int)v.size()-1;i>=0;i--)
- {
- if(v[i]>x)continue;
- Init-=sv[i];
- sv[i]=0;
- }
- }
- void emptyinterval(int l,int r)
- {
- for(int i=0;i<v.size();i++)
- {
- if(v[i]>=l&&v[i]<=r)
- {
- Init-=sv[i];
- sv[i]=0;
- }
- }
- }
- int getval(int x)
- {
- if(Init==0)emptyall();
- for(int i=0;i<v.size();i++)
- {
- if(v[i]==x)
- return sv[i];
- }
- assert(0);
- }
- } b[333];
- void block:: pourright(int x,int y)
- {
- if(Init==0)emptyall();
- for(int i=0;i<v.size();i++)
- {
- int u = v[i];
- if(u<x)continue;
- int last = sv[i];
- int zb = S[u]-sv[i];
- zb=min(zb,y);
- sv[i]+=zb;
- y-=sv[i]-last;
- Init+=sv[i]-last;
- }
- int id=-1;
- for(int i=idblock[x]+1;i<=n/333;i++)
- {
- if(Storage<=y)
- {
- ll last = b[i].Init;
- b[i].Init=min(b[i].Storage,1ll*y);
- y-=b[i].Init-last;
- }
- else
- {
- id = i;
- break;
- }
- }
- if(id!=-1)
- b[id].pourright(0,y);
- }
- void block:: pourleft(int x,int y)
- {
- if(Init==0)emptyall();
- for(int i=(int)v.size()-1;i>=0;i--)
- {
- int u = v[i];
- if(u>x)continue;
- int last = sv[i];
- int zb = S[u]-sv[i];
- zb=min(zb,y);
- sv[i]+=zb;
- y-=sv[i]-last;
- Init+=sv[i]-last;
- }
- int id=-1;
- for(int i=idblock[x]-1;i>=0;i--)
- {
- if(Storage<=y)
- {
- ll last = b[i].Init;
- b[i].Init=min(b[i].Storage,1ll*y);
- y-=b[i].Init-last;
- }
- else
- {
- id = i;
- break;
- }
- }
- if(id!=-1)
- b[id].pourleft(1e6,y);
- }
- void emptytheniggas(int l,int r)
- {
- int id1=idblock[l],id2=idblock[r];
- if(id1==id2)
- {
- return b[id1].emptyinterval(l,r);
- }
- b[id1].emptyright(l);
- b[id2].emptyleft(r);
- for(int i=id1+1;i<=id2-1;i++)
- b[i].Init=0;
- }
- int main()
- {
- cin>>n>>q;
- for(int i=1;i<=n;i++)
- {
- scanf("%d",S+i);
- b[i/333].insert(i);
- idblock[i]=i/333;
- }
- // return 0;
- for(int i=1;i<=q;i++)
- {
- int t;
- scanf("%d",&t);
- if(t==1)
- {
- int x,y;
- scanf("%d%d",&x,&y);
- b[idblock[x]].pourleft(x,y);
- }else if(t==2)
- {
- int x,y;
- scanf("%d%d",&x,&y);
- b[idblock[x]].pourright(x,y);
- }
- else if(t==3)
- {
- int x,y;
- scanf("%d%d",&x,&y);
- emptytheniggas(x,y);
- }
- else
- {
- int x;
- scanf("%d",&x);
- printf("%d\n",b[idblock[x]].getval(x));
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement