總時間限制:
10000ms
單個測試點時間限制:
1000ms
記憶體限制:
262144kb
描述給乙個長為n的數列,有m次操作,每次操作是以下兩種之一:
(1)修改數列中的乙個數
(2)求數列中某連續一段的和
輸入第一行兩個正整數n和m。
第二行n個整數表示這個數列。
接下來m行,每行開頭是乙個字元,若該字元為'm',則表示乙個修改操作,接下來兩個整數x和y,表示把x位置的值修改為y;若該字元為'q',則表示乙個詢問操作,接下來兩個整數x和y,表示求[x,y]這段區間的和。
輸出對每乙個詢問操作單獨輸出一行,表示答案。
樣例輸入
5 3樣例輸出1 2 3 4 5
q 1 5
m 2 7
q 1 5
15提示20
1<=n<=10^5,1<=m<=10^5,輸入保證合法,且所有整數及答案可用帶符號32位整型儲存。
考慮樹狀陣列肯定是沒有什麼疑問的,
但是這裡不是加減,而是直接修改,
然而直接修改會爆零,原因自己yy一下就知道。
所以說,我們每次改的時候,去加上要加的數和當前的數的差,然後再把當前的數改成將要改的數
1 #include2 #include3 #include4using
namespace
std;
5const
int maxn=100001;6
inta[maxn];
7int
tree[maxn];
8int
n,m;
9void read(int &n)
1013
while(c>='
0'&&c<='9'
)14 x=(x<<1)+(x<<3)+c-48,c=getchar();
15 flag==1?n=-x:n=x;16}
17int lb(int
p)18
21void add(int pos,int
v)2229}
30int sum(int
pos)
3139
return
ans;40}
41int
main()
4251
for(int i=1;i<=m;i++)
526263}
64return0;
65 }
樹狀陣列(3)
樹狀陣列的一些基本題型吧 之前說過,樹狀陣列能做的東西線段樹都能做 這麼簡單的樹狀陣列能不能做線段樹經常要做的改點 段 求段 點 呢?廢話,這麼簡單的東西答案當然是能啦 1 codevs 1080 include include using namespace std int c 100010 l ...
3種樹狀陣列
1 單調更新,區間查詢。sum i 的意思是從1 i的和。int n int c1 500 int lowbits int x int sum int x return sum1 int add int x,int y int main 2 區間更新,點查詢。把上面 的add x,k add y a...
樹狀陣列 模板3 求逆序對(非離散化)
離散化的樹狀陣列 這裡就提一下和普通樹狀陣列的區別,這裡是用要查詢的數當作下標,而普通樹狀陣列是直接順序下標放值,也就是說區別在於 updata函式,普通的是updata i,k 這裡的i就單純是區間下標 而求逆序對的時候是updata a i 1 我們每次都是在這個數字大小的位置上新增1,然後去更...