如題,已知乙個數列,你需要進行下面三種操作:
1.將某區間每乙個數乘上x
2.將某區間每乙個數加上x
3.求出某區間每乙個數的和
輸入格式:
第一行包含三個整數n、m、p,分別表示該數列數字的個數、操作的總個數和模數。
第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。
接下來m行每行包含3或4個整數,表示乙個操作,具體如下:
操作1: 格式:1 x y k 含義:將區間[x,y]內每個數乘上k
操作2: 格式:2 x y k 含義:將區間[x,y]內每個數加上k
操作3: 格式:3 x y 含義:輸出區間[x,y]內每個數的和對p取模所得的結果
輸出格式:
輸出包含若干行整數,即為所有操作3的結果。
輸入樣例#1:
複製
5 5 38輸出樣例#1:1 5 4 2 3
2 1 4 1
3 2 5
1 2 4 2
2 3 5 5
3 1 4
複製
17時空限制:1000ms,128m2
資料規模:
對於30%的資料:n<=8,m<=10
對於70%的資料:n<=1000,m<=10000
對於100%的資料:n<=100000,m<=100000
(資料已經過加強^_^)
樣例說明:
故輸出應為17、2(40 mod 38=2)
#includeusing namespace std;
#define maxn 100000+100000
#define ll long long
int mod;
ll tre[maxn<<2];
int a[maxn];
ll add[maxn<<2];
ll sub[maxn<<2];
void push(int in,int rt)
void build(int in,int l,int r)
int mid=(l+r)/2;
build(in*2,l,mid);
build(in*2+1,mid+1,r);
tre[in]=(tre[in]+tre[in*2]+tre[in*2+1])%mod;
}void updata(int in,int l,int r, int va,int x,int y,int i)
if(i==2)
return ;
}int mid=(x+y)/2;
if(l>mid)
else if(r<=mid)
else
tre[in]=(tre[in*2]+tre[in*2+1])%mod;
tre[in]%=mod;
}ll query(int in,int l,int r,int x,int y)
int mid=(x+y)/2;
if(l>mid)
else if(r<=mid)
else
}int main()
build(1,1,n);
while(m--)
else
}return 0;
}
線段樹模版
題目 給定乙個整數陣列 nums,求出陣列從索引 i 到 j i j 範圍內元素的總和,包含 i,j 兩點。update i,val 函式可以通過將下標為 i 的數值更新為 val,從而對數列進行修改。示例 given nums 1,3,5 sumrange 0,2 9update 1,2 sumr...
線段樹 區間更新 模版
include include cstdio include string.h using namespace std const int n 100005 struct node tree n 4 int n,m int a n void init 將下面更新的值返回上一層 void pushup...
線段樹模版 codevs1081線段樹練習2
題目描述 description 給你n個數,有兩種操作 1 給區間 a,b 的所有數都增加x 2 詢問第i個數是什麼?輸入描述 input description 第一行乙個正整數n,接下來n行n個整數,再接下來乙個正整數q,表示操作的個數.接下來q行每行若干個整數。如果第乙個數是1,後接3個正整...