線段樹 I 維護序列

2021-09-10 07:53:11 字數 2164 閱讀 1383

老師交給小可可乙個維護數列的任務,現在小可可希望你來幫他完成。

有長為 nn 的數列,不妨設為 a1,a2,⋯,ana1,a2,⋯,an。有如下三種操作形式:

input

第一行兩個整數 nn 和 pp;

第二行含有 nn 個非負整數,從左到右依次為 a1,a2,⋯,ana1,a2,⋯,an;

第三行有乙個整數 mm,表示操作總數;

從第四行開始每行描述乙個操作,輸入的操作有以下三種形式:

同一行相鄰兩數之間用乙個空格隔開,每行開頭和末尾沒有多餘空格。

output

對每個操作 33,按照它在輸入**現的順序,依次輸出一行乙個整數表示詢問結果。

example

input

7 43

1 2 3 4 5 6 7

51 2 5 5

3 2 4

2 3 7 9

3 1 3

3 4 7

output

2

358

note

對於全部測試資料,1≤t≤g≤n,0≤c,ai≤109,1≤p≤1091≤t≤g≤n,0≤c,ai≤109,1≤p≤109。

樣例說明:

初始時數列為 ;

經過第 11 次操作後,數列為 ;

對第 22 次操作,和為 10+15+20=4510+15+20=45,模 4343 的結果是 22;

經過第 33 次操作後,數列為 ;

對第 44 次操作,和為 1+10+24=351+10+24=35,模 4343 的結果是 3535;

對第 55 次操作,和為 29+34+15+16=9429+34+15+16=94,模 4343 的結果是 88。

memset置換-1,0,inf,意外其他資料會出現bug。學到了

#include #include #include using namespace std;

typedef long long ll;

#define n 410000

ll sum[n];

ll a[n];

ll lazy[n],lazy1[n];

ll n,p;

void build(ll l,ll r,ll rt)

ll mid=(l+r)/2;

build(l,mid,rt*2);

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

sum[rt]=(sum[rt*2]+sum[rt*2+1])%p;

}void pushdown(ll l,ll r,ll rt)

if(lazy[rt])

}void updatej(ll l1,ll r1,ll v,ll l,ll r,ll rt)

ll mid=(l+r)/2;

pushdown(mid-l+1,r-mid,rt);

if(l1<=mid)

if(r1>mid)

sum[rt]=(sum[rt*2]+sum[rt*2+1])%p;

}void updatem(ll l1,ll r1,ll v,ll l,ll r,ll rt)

ll mid=(l+r)/2;

pushdown(mid-l+1,r-mid,rt);

if(l1<=mid)

if(r1>mid)

sum[rt]=(sum[rt*2]+sum[rt*2+1])%p;

}ll query(ll l1,ll r1,ll l,ll r,ll rt)

ll mid=(l+r)/2;

ll ret=0;

pushdown(mid-l+1,r-mid,rt);

if(l1<=mid)

if(r1>mid)

return ret%p;

}int main()

memset(lazy,0,sizeof(lazy));

scanf("%lld %lld",&n,&p);

for(ll i=1;i<=n;i++)

build(1,n,1);

ll m;

scanf("%lld",&m);

while(m--)

if(a==2)

if(a==3)

}return 0;

}

舉個例子:1-5,+5,*3,如果先乘,就錯了

線段樹 維護序列

老師交給小可可乙個維護數列的任務,現在小可可希望你來幫他完成。有長為 n 的數列,不妨設為 a1,a2,an。有如下三種操作形式 把數列中的一段數全部乘乙個值 把數列中的一段數全部加乙個值 詢問數列中的一段數的和,由於答案可能很大,你只需輸出這個數模 p 的值。輸入格式 第一行兩個整數 n 和 p ...

線段樹yy(線段樹維護括號序列 LCA)

沒有題目鏈結 一顆有 n 個節點的樹,q 組詢問,支援兩種操作 1.單點修改 2.路徑求和。1 n,q 1e5 題解 那麼可以建立一顆有根樹,每次更新時為兩個單點更新 加一次減一次 每次查詢時則是查詢 根的左括號到 x 點的左括號之和 根的左括號到 y 點的左括號之和 2 根的左括號到 x 與 y ...

模板 維護序列2(線段樹)

取模取掛可真是令人質壁分離。兩兩乘積和可以直接用兩個區間的區間和相乘再加上兩個區間各自的乘積和得到,而相鄰乘積和直接兩段相加再加上左區間右端點與右區間左端點乘積就好了。注意 mod mod includeusing namespace std typedef long long ll const l...