求求指出WA原因,感谢!!!
源代码:
#include<bits/stdc++.h>
#define ll long long
#define i64 long long
#define ull unsigned long long
#define int long long
using namespace std;
class SegTree {
public:
int size;
vector<int>a;
vector<int>tree;
vector<int>lazy;
SegTree(){
size = 0;
}
SegTree(int n)
{
size = n;
tree.resize(n * 5);
lazy.resize(n * 5);
a.resize(n + 1);
}
SegTree(vector<int>&a)
{
this->a = a;
size = a.size()-1 ;
tree.resize(size * 5);
lazy.resize(size * 5);
}
void build()
{
int l = 1, r = size, p = 1;
build(l, r, p);
}
void build(int l,int r,int p)
{
if (l == r)
tree[p] = a[l];
else {
int mid = (l + r) / 2;
build(l, mid, p * 2);
build(mid + 1, r, (p * 2) + 1);
tree[p] = tree[(p * 2)] + tree[(p * 2) + 1];
}
return;
}
int qry(int lo, int hi)
{
return query_without_lazy(1, size, lo, hi, 1);
}
int qrywl(int lo, int hi)
{
return query_with_lazy(1, size, lo, hi, 1);
}
int query_without_lazy(int l, int r,int lo,int hi ,int p)
{
if (l >= lo && r <= hi) {
return tree[p];
}
else if (l > hi || r < lo) {
return 0;
}
else {
int mid = (l + r) / 2;
return query_without_lazy(l, mid, lo, hi, p * 2) + query_without_lazy(mid + 1, r, lo, hi, (p * 2) + 1);
}
}
void upd(int lo, int hi, int v)
{
update_via_lazy(1, size, lo, hi, 1, v);
}
void update_via_lazy(int l, int r, int lo, int hi, int p, int v)//
{
if (l >= lo && r <= hi) {//l,r in lo,hi
lazy[p] += v;
return;
}
else if (l > hi || r < lo) {//disjoint
return;
}
else {
tree[p] += (min(hi, r) - max(lo, l) + 1) * v;
int mid = (l + r) / 2;
update_via_lazy(l, mid, lo, hi, p * 2, v);
update_via_lazy(mid + 1, r, lo, hi, (p * 2) + 1, v);
return;
}
}
int query_with_lazy(int l, int r, int lo, int hi, int p)
{
int mid = (l + r) / 2;
lazy[p * 2] += lazy[p];
lazy[(p * 2) + 1] += lazy[p];
tree[p] += (r - l + 1) * lazy[p];
lazy[p] = 0;
if (l >= lo && r <= hi) {//perfect cover,stay
return tree[p];
}
else if (l > hi || r < lo) {
return 0;
}
else {
int mid = (l + r) / 2;
return query_with_lazy(l, mid, lo, hi, p * 2) + query_with_lazy(mid + 1, r, lo, hi, (p * 2) + 1);
}
}
};
void solve()
{
int n;
cin >> n;
int q;
cin >> q;
vector<int>a;
a.resize(n + 1);
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
SegTree t(a);
t.build();
for (int i = 0; i < q; i++) {
int op;
cin >> op;
if (op == 2) {
int l, r;
cin >> l >> r;
cout << t.qrywl(l, r) << endl;;
}
else {
int l, r, v;
cin >> l >> r >> v;
t.upd(l, r, v);
}
}
return;
}
signed main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
solve();
return 0;
}