线段树全RE,0分求助!
查看原帖
线段树全RE,0分求助!
965685
yyrwlj楼主2023/6/30 12:46
#include <iostream>
using namespace std;
const int N=100005,M=400005;
long long a[N],k;
struct Tree{
    long long val,tag;
    int left,right;
}tree[M];
int l,r;
void init(int u,int left,int right)
{
    if (left==right)
    {
        tree[u].val = a[left];
        tree[u].left = tree[u].right = left;
        return;
    }
    int mid=(left+right)>>1;
    init(u*2,left,mid);
    init(u*2+1,mid+1,right);
    tree[u].val = tree[u*2].val + tree[u*2+1].val;
    tree[u].left = tree[u*2].left;
    tree[u].right = tree[u*2+1].right;
}
long long find(int u)
{
    if (l <= tree[u].left && r >= tree[u].right)
        return tree[u].val;
    if (l <= tree[u].left || r >= tree[u].right)
        return find(u*2) + find(u*2+1);
    return 0;
}
void maketag(int u,int len,long long x)
{
    tree[u].val += len*x;
    tree[u].tag += x;
}
void pushdown(int u)
{
    int mid = (tree[u].left + tree[u].right) / 2;
    maketag(u*2, mid - tree[u].left + 1, tree[u].tag);
    maketag(u*2+1, tree[u].right - mid, tree[u].tag);
    tree[u].tag = 0;
}
void update(int u)
{
    if (l <= tree[u].left && r >= tree[u].right)
        maketag(u,tree[u].right - tree[u].left + 1,k);
    else if (l <= tree[u].left || r >= tree[u].right)
    {
        if (tree[u].tag)
            pushdown(u);
        update(u*2);
        update(u*2+1);
        tree[u].val = tree[u*2].val + tree[u*2+1].val;
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int n,m;
    cin >> n >> m;
    for (int i=1;i<=n;i++)
        cin >> a[i];
    init(1,1,n);

    while (m--)
    {
        int op;
        cin >> op >> l >> r;
        if (op==1)
        {
            cin >> k;
            update(1);
        }
        else
            cout << find(1) << '\n';
    }
    return 0;
}
2023/6/30 12:46
加载中...