能不能不用线段树而只用差分,先在输入时记录下所有问题,最后再统一回复?
#include <bits/stdc++.h>
#define ll long long int
#define N 100010
using namespace std;
ll n, m, mid[N], dif[N], sum[N], tip[N], q[N], cnt;
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> sum[i];
mid[i] = sum[i] - sum[i - 1];
dif[i] = mid[i] - mid[i - 1];
}
for (int i = 1; i <= m; i++) {
int p;
cin >> p;
if (p == 1) {
int l, r, k, d;
cin >> l >> r >> k >> d;
tip[l] += k;
dif[l + 1] += d;
dif[r + 1] -= d;
tip[r + 1] -= ((r - l) * d + k);
} else {
cnt++;
cin >> q[cnt];
}
}
for (int i = 1; i <= n; i++) {
mid[i] = dif[i] + mid[i - 1];
}
for (int i = 1; i <= n; i++) {
mid[i] += tip[i];
sum[i] = mid[i] + sum[i - 1];
//cout << sum[i] << " ";
}
//cout << endl;
for (int i = 1; i <= cnt; i++) {
cout << sum[q[i]] << endl;
}
}
求助啊~~~orz