제출 #1229378

#제출 시각아이디문제언어결과실행 시간메모리
1229378dibamboo23Addk (eJOI21_addk)C++20
100 / 100
263 ms14636 KiB
#include <bits/stdc++.h> #define ll long long #define F first #define S second #define sz size() using namespace std; [[maybe_unused]]const int e6=1e6; [[maybe_unused]]const int e7=1e7; [[maybe_unused]]const int e8=1e8; [[maybe_unused]]const int e9=1e9; inline int rd(){ int num;cin>>num; return num; } inline ll rdll(){ ll num;cin>>num; return num; } [[maybe_unused]]const ll inf=1e18+7; [[maybe_unused]]const ll MOD=1e9+7; [[maybe_unused]]const int N=1e6+3; struct trio{ ll res,sum; int cnt; }; trio t_l[N],t_r[N]; trio merge_r(trio A,trio B){ trio C={0,0,0}; C.res=A.res+B.res+(ll)A.cnt*B.sum; C.sum=A.sum+B.sum; C.cnt=A.cnt+B.cnt; return C; } trio merge_l(trio A,trio B){ trio C={0,0,0}; C.res=A.res+B.res+(ll)B.cnt*A.sum; C.sum=A.sum+B.sum; C.cnt=A.cnt+B.cnt; return C; } int n; void upd(int pos,int x,int v=1,int tl=1,int tr=n){ if(tl==tr){ t_l[v]={x,x,1}; t_r[v]={x,x,1}; return; } int md=(tl+tr)>>1; if(pos<=md)upd(pos,x,v+v,tl,md); else upd(pos,x,v+v+1,md+1,tr); t_l[v]=merge_l(t_l[v+v],t_l[v+v+1]); t_r[v]=merge_r(t_r[v+v],t_r[v+v+1]); } trio get_r(int l,int r,int v=1,int tl=1,int tr=n){ if(tl>=l&&tr<=r)return t_r[v]; if(tl>r||l>tr)return {0,0,0}; int md=(tl+tr)>>1; return merge_r(get_r(l,r,v+v,tl,md),get_r(l,r,v+v+1,md+1,tr)); } trio get_l(int l,int r,int v=1,int tl=1,int tr=n){ if(tl>=l&&tr<=r)return t_l[v]; if(tl>r||l>tr)return {0,0,0}; int md=(tl+tr)>>1; return merge_l(get_l(l,r,v+v,tl,md),get_l(l,r,v+v+1,md+1,tr)); } // max(l,i-m+1) // min(r-m+1,i) - max(l,i-m+1) int get(int i,int l,int r,int m){ return min(r-m+1,i)-max(l,i-m+1)+1; } int a[N],b[N]; int vals[N]; int find(int lq,int rq,int L,int R,int m,int x){ int l=lq,r=rq,res=lq; while(r>=l){ int md=(r+l)>>1; if(get(md,L,R,m)==x){ res=md; l=md+1; } else r=md-1; } return res; } void code(){ int k;cin>>n>>k; for(int i=1;i<=n;i++){ cin>>vals[i]; upd(i,vals[i]); } int q;cin>>q; while(q--){ int tp;cin>>tp; if(tp==1){ for(int i=0;i<k;i++)cin>>a[i]; for(int i=0;i<k;i++)b[i]=vals[a[(i+1)%k]]; for(int i=0;i<k;i++){ vals[a[i]]=b[i]; upd(a[i],vals[a[i]]); } continue; } int l,r,m;cin>>l>>r>>m; int md=(l+r)>>1; int x=get(md,l,r,m); int R=find(md,r,l,r,m,x); int L=l+(r-R); ll res=get_r(L,R).sum*(ll)x; if(l!=L)res+=get_r(l,L-1).res; if(r!=R)res+=get_l(R+1,r).res; cout<<res<<"\n"; } } signed main(){ ios_base::sync_with_stdio(0);cin.tie(0); int tt=1; // cin>>tt; while(tt--)code(),cout<<"\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...