Submission #1280662

#TimeUsernameProblemLanguageResultExecution timeMemory
1280662syanvuAddk (eJOI21_addk)C++20
100 / 100
158 ms7528 KiB
#include <bits/stdc++.h> // #include <ext/pb_ds/assoc_container.hpp> // #include <ext/pb_ds/tree_policy.hpp> #define SS ios_base::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr); // #pragma optimize("g", on) // #pragma GCC optimize("03") // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,avx2,mmx,fma,avx,tune=native") #define int long long // #define ull unsigned long long #define all(x) x.begin(),x.end() #define F first #define S second using namespace std; // using namespace __gnu_pbds; // #define ordered_set tree<int,null_type,less_equal<int>,rb_tree_tag,tree_order_statistics_node_update> const int LG = 17,N = 1e6 + 1,inf = 1e18 + 1, MOD = 1e9 + 7; const double eps = 1e-9; int T; int f[N]; int n,k; void upd(int i,int x){ while(i<=n){ f[i] += x; i+=i&-i; } } int get(int i){ int res=0; while(i){ res+=f[i]; i-=i&-i; } return res; } int pr[4*N],suf[4*N]; void tupd(int v,int tl,int tr,int pos,int x){ if(tl==tr){ pr[v] = x * pos; suf[v] = x * (n-pos+1); return; } int mid = (tl+tr)/2; if(mid>=pos) tupd(v*2,tl,mid,pos,x); else tupd(v*2+1,mid+1,tr,pos,x); pr[v] = pr[v*2] + pr[v*2+1]; suf[v] = suf[v*2] + suf[v*2+1]; } int getp(int v,int tl,int tr,int l,int r){ if(tl>r || l>tr) return 0; if(tl>=l && r>=tr) return pr[v]; int mid=(tl+tr)/2; return getp(v*2,tl,mid,l,r)+getp(v*2+1,mid+1,tr,l,r); } int gets(int v,int tl,int tr,int l,int r){ if(tl>r || l>tr) return 0; if(tl>=l && r>=tr) return suf[v]; int mid=(tl+tr)/2; return gets(v*2,tl,mid,l,r)+gets(v*2+1,mid+1,tr,l,r); } void solve() { cin>>n>>k; int a[n+1]; for(int i=1;i<=n;i++){ cin>>a[i]; upd(i,a[i]); tupd(1,1,n,i,a[i]); } int q; cin>>q; while(q--){ int t; cin>>t; if(t==1){ vector<int> v; for(int i=0;i<k;i++){ int x; cin>>x; v.push_back(x); } int f = a[v[0]]; for(int i=0;i<k-1;i++){ upd(v[i], a[v[i+1]] - a[v[i]]); tupd(1,1,n,v[i],a[v[i+1]]); a[v[i]] = a[v[i+1]]; } upd(v.back(), f - a[v.back()]); tupd(1,1,n,v.back(),f); a[v.back()] = f; } else{ int l,r,m; cin>>l>>r>>m; int ans = (get(r) - get(l-1)) * m; if(m == 1){ cout << ans << '\n'; continue; } int basesuf = getp(1,1,n,r-m+2,r) - (get(r) - get(r-m+1)) * (r-m+1); int basepref = gets(1,1,n,l,l+m-2) - (get(l + m - 2) - get(l-1)) * (n - (l + m - 2)); cout << ans - basesuf - basepref << '\n'; } } } /* 1 2 3 4 5 5 4 3 2 1 */ signed main() { SS int t = 1; if(T) cin >> t; while (t--) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...