線段樹 乙個簡單的整數問題(未完)

2021-09-25 19:23:14 字數 1211 閱讀 3232

你有n個整數,a1,a2,...,an。 你需要處理兩種操作。 一種操作是在給定間隔中為每個數字新增一些給定數字。 另一種是要求給定間隔中的數字總和。

第一行包含兩個數字n和q.1≤n,q≤100000。

第二行包含n個數字,a1,a2,...,an的初始值。 -1000000000≤ai≤1000000000。

接下來的q行中的每一行代表乙個操作。

「c a b c」表示將c新增到aa,aa + 1,...,ab中的每乙個。 -10000≤c≤10000。

「q a b」表示查詢aa,aa + 1,...,ab的總和。

你需要回到q個詢問,每個詢問一行。

10 5

1 2 3 4 5 6 7 8 9 10

q 4 4

q 1 10

q 2 4

c 3 6 3

q 2 4

4559

15

#includeusing namespace std; 

const int maxn=1e5+10;

#define ll long long

ll a[maxn],sum[maxn*4],lazy[maxn*4];//要開四倍空間

void pushdown(int rt,int len)

}ll query(int x,int y,int l,int r,int rt)//查詢

void update(int x,int y,int l,int r,int rt,ll z)//更新

pushdown(rt,r-l+1);//懶標記下傳

int mid=(l+r)/2;

if(x<=mid)

update(x,y,l,mid,2*rt,z);

if(y>mid)

update(x,y,mid+1,r,2*rt+1,z);

sum[rt]=sum[2*rt]+sum[2*rt+1];

}void build(int l,int r,int rt)//編號rt節點包含的區間是[l,r]

int mid=(l+r)/2;

build(l,mid,2*rt);

build(mid+1,r,2*rt+1);

sum[rt]=sum[2*rt]+sum[2*rt+1];

}int main()

}return 0;

}

線段樹 區間修改(加法) 乙個簡單的整數問題

你有n個整數,a1,a2,an。你需要處理兩種操作。一種操作是在給定間隔中為每個數字新增一些給定數字。另一種是要求給定間隔中的數字總和。第一行包含兩個數字n和q.1 n,q 100000。第二行包含n個數字,a1,a2,an的初始值。1000000000 ai 1000000000。接下來的q行中的...

乙個簡單的整數問題

給定長度為n的數列a,然後輸入m行操作指令。第一類指令形如 c l r d 表示把數列中第l r個數都加d。第二類指令形如 q x 表示詢問數列中第x個數的值。對於每個詢問,輸出乙個整數表示答案。輸入格式 第一行包含兩個整數n和m。第二行包含n個整數a i 接下來m行表示m條指令,每條指令的格式如題...

乙個簡單的整數問題

給定長度為n的數列a,然後輸入m行操作指令。第一類指令形如 c l r d 表示把數列中第l r個數都加d。第二類指令形如 q x 表示詢問數列中第x個數的值。對於每個詢問,輸出乙個整數表示答案。輸入格式 第一行包含兩個整數n和m。第二行包含n個整數a i 接下來m行表示m條指令,每條指令的格式如題...