Submission #1308386

#TimeUsernameProblemLanguageResultExecution timeMemory
1308386Jawad_Akbar_JJAddk (eJOI21_addk)C++20
0 / 100
110 ms3760 KiB
#include <iostream>

using namespace std;
#define int long long
const int N = (1<<17) + 1;
int sm[N<<1], as[N<<1], ds[N<<1], a[N], vec[11], ind[11];

void insert(int i, int v, int cur = 1, int st = 1, int en = N){
	if (i >= en or i < st)
		return;
	if (en - st == 1){
		as[cur] = ds[cur] = sm[cur] = v;
		return;
	}
	int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2;
	insert(i, v, lc, st, mid);
	insert(i, v, rc, mid, en);

	sm[cur] = sm[lc] + sm[rc];
	as[cur] = as[lc] + as[rc] + sm[rc] * (mid - st);
	ds[cur] = ds[lc] + ds[rc] + sm[lc] * (en - mid);
}

int get1(int l, int r, int cur = 1, int st = 1, int en = N){
	if (l >= en or r <= st)
		return 0;
	if (l <= st and r >= en)
		return sm[cur];
	int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2;
	return get1(l, r, lc, st, mid) + get1(l, r, rc, mid, en);
}

pair<int, int> get2(int l, int r, int cur = 1, int st = 1, int en = N){
	if (l >= en or r <= st)
		return {0, 0};
	if (l <= st and r >= en)
		return {as[cur], sm[cur]};

	int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2;
	auto [A, As] = get2(l, r, lc, st, mid);
	auto [B, Bs] = get2(l, r, rc, mid, en);

	return {A + B + Bs * max(mid - l, 0LL), As + Bs};
}

pair<int, int> get3(int l, int r, int cur = 1, int st = 1, int en = N){
	if (l >= en or r <= st)
		return {0, 0};
	if (l <= st and r >= en)
		return {ds[cur], sm[cur]};

	int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2;
	auto [A, As] = get3(l, r, lc, st, mid);
	auto [B, Bs] = get3(l, r, rc, mid, en);

	return {A + B + As * max(r - mid, 0LL), As + Bs};
}



signed main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int n, k, q;
	cin>>n>>k;

	for (int i=1;i<=n;i++)
		cin>>a[i], insert(i, a[i]);

	cin>>q;
	for (int i=1;i<=q;i++){
		int t, l, r, m;
		cin>>t;
		if (t == 1){
			for (int j=1;j<=k;j++)
				cin>>ind[j], vec[j-1] = a[ind[j]];
			vec[k] = a[ind[1]];

			for (int j=1;j<=k;j++)
				insert(ind[j], vec[j]);
		}
		else{
			cin>>l>>r>>m;
			int s = min(m - 1, r - l + 1 - m);
			cout<<get2(l, l + s).first + get3(r - s+1, r + 1).first + get1(l + s, r - s + 1) * (s + 1)<<endl;
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...