比赛 EYOI与SBOI开学欢乐赛13th 评测结果 AAWWWWWWWW
题目名称 WHZ 的序列 最终得分 20
用户昵称 该账号已注销 运行时间 2.293 s
代码语言 C++ 内存使用 12.03 MiB
提交时间 2022-10-21 22:04:26
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
int n, q;
long long a[200100], c1[200100], b1[200100], c2[200100], b2[200100];

int lb(int x) {
	return x & -x;
}

int add1(int x, int y) {
	for (int i = x; i <= n; i += lb(i)) {
		c1[i] += y;
		b1[i] += (x - 1) * y;
	}
	return 0;
}

long long query1(int x) {
	long long sum = 0;
	for (int i = x; i; i -= lb(i)) {
		sum += c1[i] * x - b1[i];
	}
	return sum;
}

int add2(int x, int y) {
	for (int i = x; i <= n; i += lb(i)) {
		c2[i] += y;
		b2[i] += (x - 1) * y;
	}
	return 0;
}

long long query2(int x) {
	long long sum = 0;
	for (int i = x; i; i -= lb(i)) {
		sum += c2[i] * x - b2[i];
	}
	return sum;
}

int main() {
	freopen("whz_sequence.in", "r", stdin);
	freopen("whz_sequence.out", "w", stdout);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		if (i % 2 == 0)
			if (i - 2 >= 0)
				add1(i / 2, a[i] - a[i - 2]);
			else
				add1(i / 2, a[i]);
		else {
			if (i - 2 >= 0)
				add2((i + 1) / 2, a[i] - a[i - 2]);
			else
				add2((i + 1) / 2, a[i]);
		}
	}
	cin >> q;
	for (int i = 1; i <= q; i++) {
		int x, y, z, w;
		cin >> x;
		if (x == 1) {
			cin >> y >> z >> w;
			if (y > z)
				swap(y, z);
			if (y % 2 == 0) {
				if (z % 2 == 0) {
					add1(y / 2, w);
					add1(z / 2 + 1, -w);
					add2(y / 2 + 1, w);
					add2(z / 2 + 1, -w);
				} else {
					add1(y / 2, w);
					add1(z / 2 + 1, -w);
					add2(y / 2 + 1, w);
					add2(z / 2 + 2, -w);
				}
			} else {
				if (z % 2 == 0) {
					add1(y / 2 + 1, w);
					add1(z / 2 + 1, -w);
					add2(y / 2 + 1, w);
					add2(z / 2 + 1, -w);
				} else {
					add1(y / 2 + 1, w);
					add1(z / 2 + 1, -w);
					add2(y / 2 + 1, w);
					add2(z / 2 + 2, -w);
				}
			}
		} else {
			cin >> y >> z;
			long long sum1 = 0, sum2 = 0, fh1 = 0, fh2 = 0;
			if (y > z)
				swap(y, z);
			if (y % 2 == 0) {
				fh1 = 1;
				fh2 = -1;
			} else {
				fh1 = -1;
				fh2 = 1;
			}
			if (y % 2 == 0) {
				if (z % 2 == 0) {
					sum1 += query1(z / 2) - query1(y / 2 - 1);
					sum2 += query2(z / 2) - query2(y / 2);
				} else {
					sum1 += query1(z / 2) - query1(y / 2 - 1);
					sum2 += query2(z / 2 + 1) - query2(y / 2);
				}
			} else {
				if (z % 2 == 0) {
					sum1 += query1(z / 2) - query1(y / 2);
					sum2 += query2(z / 2) - query2(y / 2);
				} else {
					sum1 += query1(z / 2) - query1(y / 2);
					sum2 += query2(z / 2 + 1) - query2(y / 2);
				}
			}
			long long ans = sum1 * fh1 + sum2 * fh2;
			cout << ans << endl;
		}
	}

	return 0;
}