样例过了,0分,按深进写的
查看原帖
样例过了,0分,按深进写的
865793
better_Z楼主2023/9/17 17:55
#include <iostream>
using namespace std;
const int MAXN = 100005;
int n;
long long x[4 * MAXN], y[4 * MAXN], w[4 * MAXN]={0},a[4 * MAXN];
long long s(int ax, int ay, int len) {
    int an = ax + ay * (len - 1ll);
    return 1ll * (ax + an) * len / 2;
}
void maketag(int u, int l, int r, int addx, int addy) {
    x[u] += addx;y[u] += addy;
    w[u] += s(addx, addy, r - l + 1);
}
void pushdown(int u, int l, int r) {
    int mid = (l + r) / 2;
    if (x[u] && y[u]) {
        maketag(u * 2, l, mid, x[u], y[u]);
        maketag(u * 2 + 1, mid + 1, r, x[u] + y[u] * (mid - l + 1), y[u]);
        x[u] = y[u] = 0;
    }
}
void pushup(int u) {
    w[u] = w[u * 2] + w[u * 2 + 1];
}
void build(int u,int l,int r){
    if(l==r){
       w[u]=a[l];
       return;
    }
    int mid=(l+r)>>1;
    build(u*2,l,mid);build(u*2+1,mid+1,r);
    pushup(u);
}
void update(int u, int l, int r, int ql, int qr, int addx, int addy) {
    if (ql <= l && r <= qr) {
        maketag(u, l, r, addx + (l - ql) * addy, addy);
        return;
    }
    pushdown(u, l, r);
    int mid = (l + r) / 2;
    if (ql <= mid) {
        update(u * 2, l, mid, ql, qr, addx, addy);
    }
    if (qr > mid) {
        update(u * 2 + 1, mid + 1, r, ql, qr, addx, addy);
    }
    pushup(u);
}
long long query(int u, int l, int r, int ql, int qr) {
    if (ql <= l && r <= qr) {
        return w[u];
    }
    pushdown(u, l, r);
    int mid = (l + r) / 2;
    long long ans = 0;
    if (ql <= mid) {
        ans += query(u * 2, l, mid, ql, qr);
    }
    if (qr > mid) {
        ans += query(u * 2 + 1, mid + 1, r, ql, qr);
    }
    return ans;
}
int main() {
    int m;
    cin >> n >> m;
    for(int i=1;i<=n;i++)cin>>a[i];
    build(1,1,n);
    for (int i = 0; i < m; i++) {
        int op;
        cin >> op;
        if (op == 1) {
            int l, r, k, d;
            cin >> l >> r >> k >> d;
            update(1, 1, n, l, r, k, d);
        } else if (op == 2) {
            int p;
            cin >> p;
            cout << query(1, 1, n, p, p) << endl;
        }
    }
    return 0;
}
2023/9/17 17:55
加载中...