蒟蒻爆零,求dalao帮助
查看原帖
蒟蒻爆零,求dalao帮助
148098
心怀荣耀楼主2021/10/21 22:05
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct tree
{
    int l, r, addlazy=0, ans;
} t[2000100];
int n, m, a[2000100];
void build(int l, int r, int k)
{
    t[k].l = l;
    t[k].r = r;
    if (l == r)
    {
        t[k].ans = a[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(l, mid, k << 1);
    build(mid + 1, r, k << 1 | 1);
    t[k].ans = t[k << 1].ans + t[k << 1 | 1].ans;
    return;
}
void pushdown(int k)
{
    int mid = (t[k].l + t[k].r) >> 1;
    t[k << 1].ans += (mid - t[k].l + 1) * t[k].addlazy;
    t[k << 1 | 1].ans += (t[k].r - mid) * t[k].addlazy;
    t[k << 1].addlazy += t[k].addlazy;
    t[k << 1 | 1].addlazy += t[k].addlazy;
    t[k].addlazy = 0;
    return;
}
void t_add(int l, int r, int ans, int k)
{
    if (t[k].l >= l && t[k].r <= r)
    {
        t[k].ans += (t[k].r - t[k].l + 1) * ans;
        t[k].addlazy += ans;
        return;
    }
    if (t[k].l > r || t[k].r < l)
        return;
    if (t[k].addlazy)
        pushdown(k);
    t_add( l, r,ans,k << 1);
    t_add( l, r, ans,k << 1 | 1);
    t[k].ans = t[k << 1].ans+ t[k << 1 | 1].ans;
}
int query(int l,int r,int k){
    if (t[k].l >= l && t[k].r <= r)
    {
        return t[k].ans;
    }
    if (t[k].l > r || t[k].r < l)
        return 0;
    if (t[k].addlazy)pushdown(k);
    return query( l, r,k << 1) + query( l, r,k << 1 | 1);
}
signed main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    build(1, n, 1);
    int a, b, c;
    for (int i = 1; i <= m; i++)
    {
        cin >> a;
        if (a == 1)
        {
            cin >> a >> b >> c;
            t_add(a, b, c, 1);
        }
        if (a == 2)
        {
            cin>>a>>b;
            cout<<query(a,b,1)<<endl;
        }
    }
    return 0;
}
2021/10/21 22:05
加载中...