rt
算法是线段树差分,样例能过,自己写了几个数据也过了,但是提交就全红,代码如下:
#include<bits/stdc++.h>
#define FOR(i, a, b) for(int (i) = (a); (i) <= (b); (i)++)
#define itn int
using namespace std;
int a[100005], b[100005];
struct aaaa{
int ll, rr, sum, lazy;
}e[400005];
void build(int k, int l, int r){
e[k].ll = l, e[k].rr = r, e[k].lazy = 0;
if(l == r){
e[k].sum = a[l];
return;
}
int mid = (l + r) / 2;
build(k*2, l, mid);
build(k*2+1, mid+1, r);
e[k].sum = e[k*2].sum + e[k*2+1].sum;
return;
}
void addd(int k, int l, int r, int s){
//cout << k << '%' << l << '%' << r << '%' << (r < e[k].ll || e[k].rr < l) << endl;
if(r < e[k].ll || e[k].rr < l)return;
if(l <= e[k].ll && e[k].rr <= r){
e[k].sum += (e[k].rr - e[k].ll + 1) * s;
e[k].lazy += s;
//cout << k << "%%" << e[k].sum << "%" << e[k].lazy << endl;
return;
}
int mid = (e[k].ll + e[k].rr) / 2;
addd(k*2, l, r, s);
addd(k*2+1, l, r, s);
e[k].sum = e[k*2].sum + e[k*2+1].sum;
//cout << k << '%' << e[k].sum << endl;
return;
}
void pushdown(int k){
e[k*2].sum += e[k].lazy*(e[k*2].rr - e[k*2].ll + 1);
e[k*2].lazy += e[k].lazy;
e[k*2+1].sum += e[k].lazy*(e[k*2+1].rr - e[k*2+1].ll + 1);
e[k*2+1].lazy += e[k].lazy;
e[k].lazy = 0;
}
int find(int k, int l, int r){
//cout << k << '#' << l << '#' << r << '#' << (r < e[k].ll || e[k].rr < l) << endl;
if(r < e[k].ll || e[k].rr < l)return 0;
if(e[k].lazy)pushdown(k);
if(l <= e[k].ll && e[k].rr <= r){
//cout << "##" << e[k].sum << endl;
return e[k].sum;
}
int mid = (e[k].ll + e[k].rr) / 2, ans = 0;
ans += find(k*2, l, r);
ans += find(k*2+1, l, r);
//cout << '#' << ans << endl;
return ans;
}
int main(){
int n,m;
cin >> n >> m;
FOR(i, 1, n)cin >> a[i];
for(int i = n-1; i; i--){
a[i+1] = a[i+1] - a[i];
}
build(1, 1, n);
FOR(i, 1, m){
int opt;
cin >> opt;
if(opt == 1){
int l, r, K, D;
cin >> l >> r >> K >> D;
addd(1, l, l, K);
addd(1, l+1, r, D);
addd(1, r+1, r+1, -K-(r-l)*D);
}
else if(opt == 2){
int p;
cin >> p;
cout << find(1, 1, p) << endl;
}
}
return 0;
}