Submission #774780

#TimeUsernameProblemLanguageResultExecution timeMemory
774780vjudge1Addk (eJOI21_addk)C++98
100 / 100
210 ms8756 KiB
#include<bits/stdc++.h> #define int long long using namespace std; struct Node { int tang, sum, giam; }; Node st[400005]; int a[100001], n, k; Node combine(Node a, Node b) { Node ans; ans.tang = a.tang + b.tang; ans.sum = a.sum + b.sum; ans.giam = a.giam + b.giam; return ans; } void build(int node, int l, int r) { if(l == r){ st[node].sum = a[l]; st[node].tang = a[l]*l; st[node].giam = a[l]*(n-l+1); } else{ build(node*2, l, (l+r)/2); build(node*2+1, (l+r)/2+1, r); st[node] = combine(st[node*2], st[node*2+1]); } } void update(int node, int l, int r, int p, int v) { if(r < p || l > p) return; if(l == p && r == p){ a[p] = v; st[node].sum = a[l]; st[node].tang = a[l]*l; st[node].giam = a[l]*(n-l+1); } else{ update(node*2, l, (l+r)/2, p, v); update(node*2+1, (l+r)/2+1, r, p, v); st[node] = combine(st[node*2], st[node*2+1]); } } int query(int node, int l, int r, int tl, int tr) { if(l > tr || r < tl) return 0; else if(l >= tl && r <= tr) return st[node].sum; else return query(node*2, l, (l+r)/2, tl, tr) + query(node*2+1, (l+r)/2+1, r, tl, tr); } int queryTang(int node, int l, int r, int tl, int tr) { if(l > tr || r < tl) return 0; else if(l >= tl && r <= tr) return st[node].tang; else return queryTang(node*2, l, (l+r)/2, tl, tr) + queryTang(node*2+1, (l+r)/2+1, r, tl, tr); } int queryGiam(int node, int l, int r, int tl, int tr) { if(l > tr || r < tl) return 0; else if(l >= tl && r <= tr) return st[node].giam; else return queryGiam(node*2, l, (l+r)/2, tl, tr) + queryGiam(node*2+1, (l+r)/2+1, r, tl, tr); } int tiento(int l, int r) { if(r < l) return 0; else return queryTang(1, 1, n, l, r) - (l-1) * query(1, 1, n, l, r); } int hauto(int l, int r) { if(r < l) return 0; else return queryGiam(1, 1, n, l, r) - (n-r) * query(1, 1, n, l, r); } signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cin>>n>>k; for(int i = 1; i <= n; i++) cin>>a[i]; build(1, 1, n); int q; cin>>q; for(int test = 0; test < q; test++){ int type; cin>>type; if(type == 1){ vector<int> wtf(k); for(int i = 0; i < k; i++) cin>>wtf[i]; int re = a[wtf[0]]; for(int i = 0; i < k; i++) update(1, 1, n, wtf[i], a[wtf[i+1]]); update(1, 1, n, wtf[k-1], re); //cout<<a[wtf[0]]<<" "<<a[wtf[1]]<<" "<<a[wtf[2]]<<" "<<wtf[0]<<" "<<wtf[1]<<" "<<wtf[2]<<endl; } else{ int l, r, m; cin>>l>>r>>m; int maximum; if(r-l+1 >= 2*m-1) maximum = m; else maximum = m-(2*m-1 - (r-l+1)); //cout<<maximum<<'\n'; int x = tiento(l, l+maximum-2), y = hauto(r-maximum+2, r), z = maximum * query(1, 1, n, l+maximum-1, r-maximum+1); //cout<<x<<" "<<y<<" "<<z<<endl; cout<<x+y+z<<'\n'; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...