Submission #475468

#TimeUsernameProblemLanguageResultExecution timeMemory
475468akobiAddk (eJOI21_addk)C++98
100 / 100
676 ms6652 KiB
#include <bits/stdc++.h> #define ll long long #define mp make_pair #define F first #define S second #define pb push_back using namespace std; ll n,f1[400005],f2[400005],a[100005]; void upd1(ll id,ll L,ll R,ll f,ll d) { if (f<L || R<f) return; if (L==R) { f1[id]=d; f2[id]=d*(f+1); return; } upd1( 2*id , L ,(L+R)/2,f,d); upd1(2*id+1,(L+R)/2+1, R ,f,d); f1[id]=f1[2*id]+f1[2*id+1]; f2[id]=f2[2*id]+f2[2*id+1]; return; } void upd(vector< pair<ll,ll> > u) { ll temp=u[0].F; for (ll i=0; i<(ll)(u.size())-1; i++) a[u[i].S]=u[i+1].F; a[u[u.size()-1].S]=temp; for (ll i=0; i<(ll)(u.size()); i++) upd1(1,0,n-1,u[i].S,u[(i+1)%u.size()].F); return; } ll get1(ll id,ll L,ll R,ll l,ll r) { if (R<l || r<L) return 0; if (l<=L && R<=r) return f1[id]; return get1( 2*id , L ,(L+R)/2,l,r)+ get1(2*id+1,(L+R)/2+1, R ,l,r); } ll get2(ll id,ll L,ll R,ll l,ll r) { if (R<l || r<L) return 0; if (l<=L && R<=r) return f2[id]; return get2( 2*id , L ,(L+R)/2,l,r)+ get2(2*id+1,(L+R)/2+1, R ,l,r); } ll get(ll L,ll R,ll m) { if (m==1) return get1(1,0,n-1,L,R); ll ans=0; ans+=get2(1,0,n-1,L,min(L+m-1,R-m+1)-1); ans-=get1(1,0,n-1,L,min(L+m-1,R-m+1)-1)*L; ans+=get1(1,0,n-1,min(L+m-1,R-m+1),max(L+m-1,R-m+1)) *(min(L+m-1,R-m+1)-L+1); ans-=get2(1,0,n-1,max(L+m-1,R-m+1)+1,R); ans+=get1(1,0,n-1,max(L+m-1,R-m+1)+1,R)*(R+2); return ans; } ll k,q,qt,l,r,m; vector< pair<ll,ll> > u; int main() { cin>>n>>k; u.pb(mp(0,0)); for (ll i=0; i<n; i++) { cin>>a[i]; u[0]=mp(a[i],i); upd(u); } for (ll i=1; i<k; i++) u.pb(mp(0,0)); cin>>q; while (q--) { cin>>qt; if (qt==1) { for (ll i=0; i<k; i++) { cin>>u[i].S; u[i].S--; u[i].F=a[u[i].S]; } upd(u); } else { cin>>l>>r>>m; cout<<get(l-1,r-1,m)<<endl; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...