Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define SPEED ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
- #define fileio freopen("in.in", "r", stdin),freopen("out.out", "w", stdout);
- #define ll long long int
- #define FF first
- #define SS second
- #define mp make_pair
- #define pb push_back
- #define pii pair<int,int>
- #define pll pair<long long int,long long int>
- #define sd(x) scanf("%d",&x)
- #define slld(x) scanf("%lld",&x)
- #define pd(x) printf("%d\n",x)
- #define plld(x) printf("%lld\n",x)
- #define pss printf
- #define MOD 1000000007
- #define INF 1e18
- #define eps 0.00001
- #define endl '\n'
- #define debug(n1) cout<<n1<<endl
- const int N=200005;
- int n,q;
- ll a[N];
- ll b[N];
- ll tree[4*N];
- int lazy[4*N];
- int ql[N];
- int aql[N],aqr[N];
- int root[N];
- int lft[5000000];
- int rgt[5000000];
- ll ptree[5000000];
- int cur=0;
- ll pquery(int l,int r,int s,int e,int i)
- {
- if(s>r||e<l)
- return 0;
- if(s>=l&&e<=r)
- return ptree[i];
- int mid=(s+e)>>1;
- return (pquery(l,r,s,mid,lft[i])+pquery(l,r,mid+1,e,rgt[i]));
- }
- void pupd(int l,int s,int e,int i,int x)
- {
- if(s==e)
- {
- ptree[i]=x;
- return;
- }
- int mid=(s+e)>>1;
- if(l<=mid)
- {
- ptree[cur]=ptree[lft[i]];
- lft[cur]=lft[lft[i]];
- rgt[cur]=rgt[lft[i]];
- lft[i]=cur++;
- pupd(l,s,mid,lft[i],x);
- }
- else
- {
- ptree[cur]=ptree[rgt[i]];
- lft[cur]=lft[rgt[i]];
- rgt[cur]=rgt[rgt[i]];
- rgt[i]=cur++;
- pupd(l,mid+1,e,rgt[i],x);
- }
- ptree[i]=(ptree[lft[i]]+ptree[rgt[i]]);
- }
- void buildpseg(int l,int r,int i)
- {
- if(l==r)
- {
- ptree[i]=b[l];
- return;
- }
- int mid=(l+r)>>1;
- lft[i]=cur++;
- rgt[i]=cur++;
- buildpseg(l,mid,lft[i]);
- buildpseg(mid+1,r,rgt[i]);
- ptree[i]=ptree[lft[i]]+ptree[rgt[i]];
- }
- void lazify(int s,int e,int i)
- {
- if(lazy[i])
- {
- tree[i]=pquery(s-aql[lazy[i]]+ql[lazy[i]],e-aql[lazy[i]]+ql[lazy[i]],1,n,root[lazy[i]]);
- if(s!=e)
- {
- lazy[2*i]=lazy[i];
- lazy[2*i+1]=lazy[i];
- }
- lazy[i]=0;
- }
- }
- void aupd(int l,int r,int s,int e,int i,int in)
- {
- lazify(s,e,i);
- if(s>r||e<l)
- return;
- if(s>=l&&e<=r)
- {
- lazy[i]=in;
- lazify(s,e,i);
- return;
- }
- int mid=(s+e)>>1;
- aupd(l,r,s,mid,2*i,in);
- aupd(l,r,mid+1,e,2*i+1,in);
- tree[i]=tree[2*i]+tree[2*i+1];
- }
- ll aquery(int l,int r,int s,int e,int i)
- {
- if(s>r||e<l)
- return 0;
- lazify(s,e,i);
- if(s>=l&&e<=r)
- return tree[i];
- int mid=(s+e)>>1;
- return (aquery(l,r,s,mid,2*i)+aquery(l,r,mid+1,e,2*i+1));
- }
- void buildseg(int l,int r,int i)
- {
- if(l==r)
- {
- tree[i]=a[l];
- return;
- }
- int mid=(l+r)>>1;
- buildseg(l,mid,2*i);
- buildseg(mid+1,r,2*i+1);
- tree[i]=tree[2*i]+tree[2*i+1];
- }
- int main()
- {
- SPEED;
- cin>>n>>q;
- for(int i=1;i<=n;i++)
- cin>>a[i];
- for(int i=1;i<=n;i++)
- cin>>b[i];
- buildseg(1,n,1);
- root[0]=cur++;
- buildpseg(1,n,root[0]);
- for(int i=1;i<=q;i++)
- {
- root[i]=cur++;
- ptree[root[i]]=ptree[root[i-1]];
- lft[root[i]]=lft[root[i-1]];
- rgt[root[i]]=rgt[root[i-1]];
- int t;
- cin>>t;
- if(t==1)
- {
- int x,y;
- cin>>x>>y;
- // b[x]=y;
- pupd(x,1,n,root[i],y);
- }
- else if(t==2)
- {
- cin>>aql[i]>>aqr[i]>>ql[i];
- // for(int j=aql[i];j<=aqr[i];j++)
- // a[j]=b[ql[i]+j-aql[i]];
- aupd(aql[i],aqr[i],1,n,1,i);
- }
- else
- {
- int l,r;
- cin>>l>>r;
- // for(int j=l;j<=r;j++)
- // summ+=a[j];
- ll d=aquery(l,r,1,n,1);
- cout<<d<<endl;
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment