題目:如題,已知乙個數列,你需要進行下面兩種操作:
1.將某乙個數加上x
2.求出某區間每乙個數的和
第一行包含兩個整數n、m,分別表示該數列數字的個數和操作的總個數。
第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。
接下來m行每行包含3個整數,表示乙個操作,具體如下:
操作1: 格式:1 x k 含義:將第x個數加上k
操作2: 格式:2 x y 含義:輸出區間[x,y]內每個數的和
輸出包含若干行整數,即為所有操作2的結果。
輸入 #1
5 5輸出 #11 5 4 2 3
1 1 3
2 2 5
1 3 -1
1 4 2
2 1 4
14時空限制:1000ms,128m16
資料規模:
對於30%的資料:n<=8,m<=10
對於70%的資料:n<=10000,m<=10000
對於100%的資料:n<=500000,m<=500000
樣例說明:
故輸出結果14、16
////created by hanjinyu on 19-9-2.
//#includeusing
namespace
std;
typedef
long
long
ll;const
int maxn=1e6+10
;int
n,m;
intans;
intinput[maxn];
struct
nodetree[maxn*4
];void pushup(int
index)
void build(int l,int r,int
index)
int mid=(l+r)>>1
; build(l,mid,index
<<1
); build(mid+1,r,index<<1|1
); pushup(index);
}void change(int index,int dis,int
k)
if(dis<=tree[index<<1
].right)
change(index
<<1
,dis,k);
else
change(index
<<1|1
, dis, k);
pushup(index);
}void search(int index,int l,int
r)
if(tree[index<<1].right>=l)
search(index
<<1
,l,r);
if(tree[index<<1|1].left<=r)
search(index
<<1|1
,l,r);
}int
main()
build(
1,n,1
);
intx,y,z;
for(int i=1;i<=m;i++)
}return0;
}
P3374 模板 樹狀陣列 1
如題,已知乙個數列,你需要進行下面兩種操作 1.將某乙個數加上x 2.求出某區間每乙個數的和 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3個整數,表示乙個操作,具體如下 操作1 ...
P3374 模板 樹狀陣列 1
如題,已知乙個數列,你需要進行下面兩種操作 1.將某乙個數加上x 2.求出某區間每乙個數的和 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3個整數,表示乙個操作,具體如下 操作1 格式 1 ...
洛谷P3374 樹狀陣列 1
乙個數列,滿足如下操作 給其中乙個數加x 求區間和 數列長度n,運算元m滿足1 n m 500000 1 n,m 500000 1 n m 5 0000 0樹狀陣列基礎支援這兩種操作,核心思想是將 1 i 的整體和分成許多個小的區間和,分割的條件是二進位制拆分。首先介紹乙個lowbit,意思是取到二...