如題,已知乙個數列,你需要進行下面兩種操作:
1.將某區間每乙個數加上x
2.求出某區間每乙個數的和
輸入格式:
第一行包含兩個整數n、m,分別表示該數列數字的個數和操作的總個數。
第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。
接下來m行每行包含3或4個整數,表示乙個操作,具體如下:
操作1: 格式:1 x y k 含義:將區間[x,y]內每個數加上k
操作2: 格式:2 x y 含義:輸出區間[x,y]內每個數的和
輸出格式:
輸出包含若干行整數,即為所有操作2的結果。
輸入樣例#1:
551輸出樣例#1:5423
2241
2322
3411
5121
4
11時空限制:1000ms,128m820
資料規模:
對於30%的資料:n<=8,m<=10
對於70%的資料:n<=1000,m<=10000
對於100%的資料:n<=100000,m<=100000
(資料已經過加強^_^,保證在int64/long long資料範圍內)
樣例說明:
線段樹真的不好寫啊啊啊啊 但是真的很有用啊啊 樹狀陣列被拋棄了qaq
線段樹2戳這裡哦~
//區間修改區間查詢#include#include
#include
#define ll long long
#define ls step<<1
#define rs step<<1|1
using
namespace
std;
const ll maxn=100020
;ll n,m,w[maxn
<<2],tag[maxn<<2
],a[maxn];
void
plus(ll step)
void
build(ll step,ll l,ll r)
ll mid=(l+r)>>1
; build(ls,l,mid);
build(rs,mid+1
,r);
plus(step);
}void
push_up(ll step,ll k,ll l,ll r)
void
push_down(ll step,ll l,ll r)
void
update(ll step,ll k,ll l,ll r,ll nl,ll nr)
push_down(step,l,r);
ll mid=(l+r)>>1
;
if(mid>=nl) update(ls,k,l,mid,nl,nr);
if(mid1
,r,nl,nr);
plus(step);
}ll query(ll step,ll l,ll r,ll nl,ll nr)
intmain()
else printf("
%lld\n
",query(1,1
,n,p,q));
}return0;
}
洛谷 P3372 線段樹 1
今天植樹節,來種一棵線段樹。傳送門如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第 i 個數字表示數列第 i 項的初始值。接下來m行每...
洛谷 P3372 線段樹1
這是一道模板題 線段樹介紹 1 include2 using namespace std 3int m,n 4int a 100001 5 6struct nodexds 4 100001 4倍空間 1011 一 建樹 12void buid int l,int r,int k 19 int m l...
洛谷 P3372 線段樹 模板1
模板一是區間加修改和區間和 例題 如下 include includeusing namespace std struct tree int rt 1,cnt 2 int n,i,m const int maxa 100000 tree tree maxa 1 結構體模擬線段樹 long long ...