70分卡住了,后三组大数据不是输出一堆0就是只输出几个结果就没了
#include <iostream>
using namespace std;
typedef long long ll;
const int MAXN = 1005;
ll tree[4*MAXN], num[MAXN], n, m;
ll tag[4*MAXN];
void Build(int k, int l, int r) {
if (l == r) {
tree[k] = num[l];
return;
}
int mid = (l + r) >> 1;
Build(k << 1, l, mid);
Build(k << 1 | 1, mid + 1, r);
tree[k] = tree[k << 1] + tree[k << 1 | 1];
/*
if (k == 1) {
cout << "建立的线段树为:";
for (int i = 1; i <= 4 * n; i++) {
cout << tree[i] << " ";
}
cout << endl;
}*/
}
void Lazy_tag(int k, int l, int r, int x, int y, ll v) {//k->当前节点 l,r->当前节点表示区间 x,y->目标区间 v->修改值
if (l >= x && r <= y) { //如果当前区间完全包含需标记区间
tag[k] += (r - l + 1) * v; //标记当前节点
/*
if (k == 1) {
cout << "线段树上的标记为:";
for (int i = 1; i <= 4 * n; i++) {
cout << tag[i] << " ";
}
cout << endl;
}
*/
return;
}
if (l > y || r < x) { //如果当前区间与目标区间完全不相关
return;
}
int mid = (l + r) >> 1; //二分两棵子树
Lazy_tag(k << 1, l, mid, x, y, v); //左子树
Lazy_tag(k << 1 | 1, mid + 1, r, x, y, v); //右子树
/*
if (k == 1) {
cout << "线段树上的标记为:";
for (int i = 1; i <= 4 * n; i++) {
cout << tag[i] << " ";
}
cout << endl;
}
*/
}
void Down(int k, int l, int r, ll num) {
int mid = (l + r) >> 1;
int a = mid - l + 1, b = r - mid;
tag[k << 1] += num * a / (a + b);
tag[k << 1 | 1] += num * b / (a + b);
tag[k] = 0;
/*
cout << "标记下传,更新后标记为:";
for (int i = 1; i <= 4 * n; i++) {
cout << tag[i] << " ";
}
cout << endl;
*/
}
ll Find(int k, int l, int r, int x, int y) {//k->当前节点 l,r->当前节点表示区间 x,y->标记区间
if (l > y || r < x) {
return 0;
}
if (tag[k] != 0) {
tree[k] += tag[k];
Down(k, l, r, tag[k]);
//return tree[k];
}
if (l == r) {
return tree[k];
}
int ans = 0;
int mid = (l + r) >> 1;
ans += Find(k << 1, l, mid, x, y);
ans += Find(k << 1 | 1, mid + 1, r, x, y);
tree[k] = tree[k << 1] + tree[k << 1 | 1];
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> num[i];
}
Build(1, 1, n);
/*
for (int i = 1; i <= n << 2; i++) {
cout << tree[i] << " ";
}
Lazy_tag(1, 1, n, 1, 3, 1);
for (int i = 1; i <= n << 2; i++) {
cout << tag[i] << " ";
}
cout << endl;
cout << Find(1, 1, n, 1, 3) << endl;
for (int i = 1; i <= n << 2; i++) {
cout << tree[i] << " ";
}
*/
for (int i = 1; i <= m; i++) {
int cmd;
cin >> cmd;
if (cmd == 1) {
int x, y, k;
cin >> x >> y >> k;
Lazy_tag(1, 1, n, x, y, k);
}
else if (cmd == 2) {
int x, y;
cin >> x >> y;
cout << Find(1, 1, n, x, y) << endl;
}
}
return 0;
}
/*
5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4
*/