模板写炸,求助,只有T1 A 了,剩下全WA
查看原帖
模板写炸,求助,只有T1 A 了,剩下全WA
231591
FishingStar楼主2020/12/9 06:40
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
long long a[400005];
long long sum[400005];
long long tag[400005];
long long lchild(long long p){
    return (p << 1);
}
long long rchild(long long p){
    return (p << 1) + 1;
}
void push_up(long long p){
    sum[p] = sum[lchild(p)] + sum[rchild(p)];
    return;
}
void buildtree(long long p, long long l, long long r){
    if(l == r){
        sum[p] =  a[l];
        return;
	}
	long long mid = ((l + r) >> 1);
	buildtree(lchild(p), l, mid);
	buildtree(rchild(p), mid + 1, r);
	push_up(p);
}
void data(long long p, long long l, long long r, long long ql, long long qr, long long t){
    if(l >= ql && r <= qr){
        sum[p] += (r - l + 1) * t;
        tag[p] += t;
        return;
	}
	long long mid = ((l + r) >> 1);
	if(mid >= ql){
	    data(lchild(p), l, mid, ql, qr, t);
	}
	if(mid < qr){
	    data(rchild(p), mid + 1, r, ql, qr, t);
	}
	push_up(p);
}
void movetag(long long p, long long l, long long r, long long t){
    sum[p] += (r - l + 1) * t;
    tag[p] += t;
    return;
}
void push_down(long long p, long long l, long long r){
	long long mid  = ((l + r) >> 1);
    movetag(lchild(p), l, mid, tag[p]);
    movetag(rchild(p), mid + 1, r, tag[p]);
    tag[p] = 0;
}
long long query(long long p, long long l, long long r, long long ql, long long qr){
//	cout << "l, r = " << l << " " << r << endl;
    if(l >= ql && r <= qr){
        return sum[p];
	}
    push_down(p, l, r);
    long long ans = 0;
    int mid = ((l + r) >> 1);
    if(mid >= ql){
        ans += query(lchild(p), l, mid, ql, qr);
	}
	if(mid < qr){
	    ans += query(rchild(p), mid + 1, r, ql, qr);
	}
	return ans;
}
int main(){
    long long n, m;
    cin >> n >> m;
    for(long long i = 1; i <= n; i++){
        cin >> a[i];
	}
    buildtree(1, 1, n);
    for(int i = 0; i < m; i++){
        int op;
        cin >> op;
        if(op == 1){
            long long x, y, k;
            cin >> x >> y >> k;
            data(1, 1, n, x, y, k);
		} else{
		    long long x, y;
		    cin >> x >> y;
		    cout << query(1, 1, n, x, y) << endl;
		}
	}
    return 0;
}

2020/12/9 06:40
加载中...