# P2023 [AHOI2009]维护序列

```7 43
1 2 3 4 5 6 7
5
1 2 5 5
3 2 4
2 3 7 9
3 1 3
3 4 7```

```2
35
8```

## 说明

【样例说明】

N= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000

M= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000

Source: Ahoi 2009

```  1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 #include<algorithm>
6 #define lli long long
7 using namespace std;
8 const int MAXN=500001;
9 lli n,m,mod,ans;
11 {
12     char c='+';lli x=0;bool flag=0;
13     while(c<'0'||c>'9')
14     {c=getchar();if(c=='-')flag=1;}
15     while(c>='0'&&c<='9')
16     {x=x*10+(c-48),c=getchar();}
17     flag==1?n=-x:n=x;
18 }
19 struct node
20 {
21     lli l,r,w,k,fc,fj;
22 }tree[MAXN*4];
23 void pushdown(lli k,lli ll,lli rr,lli mid)
24 {
25     tree[k<<1].w*=tree[k].fc%mod;
26     tree[k<<1|1].w*=tree[k].fc%mod;
27     tree[k<<1].w=(tree[k<<1].w+tree[k].fj*(mid-ll+1))%mod;
28     tree[k<<1|1].w=(tree[k<<1|1].w+tree[k].fj*(rr-mid))%mod;
29
30     tree[k<<1].fc%=mod;tree[k<<1|1].fc%=mod;
31     tree[k<<1].fj%=mod;tree[k<<1|1].fj%=mod;
32     tree[k<<1].w%=mod;tree[k<<1|1].w%=mod;
33
34     tree[k<<1].fc*=tree[k].fc%mod;tree[k<<1|1].fc*=tree[k].fc%mod;
35     tree[k<<1].fj*=tree[k].fc%mod;tree[k<<1|1].fj*=tree[k].fc%mod;
36     tree[k<<1].fj=(tree[k<<1].fj+tree[k].fj)%mod;
37     tree[k<<1|1].fj=(tree[k<<1|1].fj+tree[k].fj)%mod;
38
39
40     tree[k].fc=1;
41     tree[k].fj=0;
42
43
44     tree[k<<1].fc%=mod;tree[k<<1|1].fc%=mod;
45     tree[k<<1].fj%=mod;tree[k<<1|1].fj%=mod;
46     tree[k<<1].w%=mod;tree[k<<1|1].w%=mod;
47 }
48 void update(lli k)
49 {
50     tree[k].w=(tree[k<<1].w+tree[k<<1|1].w)%mod;
51 }
52 void build_tree(lli ll,lli rr,lli k)
53 {
54     tree[k].l=ll;tree[k].r=rr;tree[k].k=k;
55     tree[k].fc=1;tree[k].fj=0;
56     if(tree[k].l==tree[k].r)
57     {
59         tree[k].w%=mod;
60         return ;
61     }
62     lli mid=(ll+rr)>>1;
63     build_tree(ll,mid,k<<1);
64     build_tree(mid+1,rr,k<<1|1);
65     update(k);
66 }
67 void interval_mul(lli k,lli ll,lli rr,lli v)
68 {
69     if(ll>tree[k].r||rr<tree[k].l)
70     return ;
71     if(tree[k].l>=ll&&tree[k].r<=rr)
72     {
73         tree[k].w*=v%mod;
74         tree[k].fc*=v%mod;
75         tree[k].fj*=v%mod;
76         return ;
77     }
78     lli mid=(tree[k].l+tree[k].r)>>1;
79     pushdown(k,tree[k].l,tree[k].r,mid);
80     if(ll<=mid)
81         interval_mul(k<<1,ll,rr,v);
82     if(rr>mid)
83         interval_mul(k<<1|1,ll,rr,v);
84     update(k);
85 }
86 void interval_add(lli k,lli ll,lli rr,lli v)
87 {
88     if(ll>tree[k].r||rr<tree[k].l)
89     return ;
90     if(tree[k].l>=ll&&tree[k].r<=rr)
91     {
92         tree[k].w=(tree[k].w+v*(tree[k].r-tree[k].l+1))%mod;
93         //tree[k].fc*=v%mod;
94         tree[k].fj=(tree[k].fj+v)%mod;
95         return ;
96     }
97     lli mid=(tree[k].l+tree[k].r)>>1;
98     pushdown(k,tree[k].l,tree[k].r,mid);
99     if(ll<=mid)
101     if(rr>mid)
103     update(k);
104
105 }
106 void interval_ask(lli k,lli ll,lli rr)
107 {
108     if(ll>tree[k].r||rr<tree[k].l)
109     return ;
110     if(tree[k].l>=ll&&tree[k].r<=rr)
111     {
112         ans=(ans+tree[k].w)%mod;
113         return ;
114     }
115     lli mid=(tree[k].l+tree[k].r)>>1;
116     pushdown(k,tree[k].l,tree[k].r,mid);
117     if(ll<=mid)
119     if(rr>mid)
121     update(k);
122 }
123 int main()
124 {
126     build_tree(1,n,1);
128     for(lli i=1;i<=m;i++)
129     {
130         lli how,x,y,c;
132         if(how==1)
133         {
135             interval_mul(1,x,y,c%mod);//乘
136         }
137         else if(how==2)
138         {
141         }
142         else if(how==3)
143         {
144             ans=0;
147             printf("%lld\n",ans);
148         }
149     }
150     return 0;
151 }```
``` 1 #include<iostream>
2 #include<cstdio>
3 #define lli long long int
4 #define re register
5 #define LL long long
6 #define M 500000
7 using namespace std;
9 {
10     char c='+';lli x=0;bool flag=0;
11     while(c<'0'||c>'9')
12     {c=getchar();if(c=='-')flag=1;}
13     while(c>='0'&&c<='9')
14     {x=x*10+(c-48),c=getchar();}
15     flag==1?n=-x:n=x;
16 }
17 LL mogician,a[M/2+1];
18 int n;
19 struct Tree{
21 }tr[M+1];
22 inline void build(int k,int l,int r){
23     tr[k].mult=1;
24     if(l==r){
25         tr[k].sum=a[l];
26         return ;
27     }
28     int mid=(l+r)>>1;
29     build(k<<1,l,mid);
30     build(k<<1|1,mid+1,r);
31     tr[k].sum=(tr[k<<1].sum+tr[k<<1|1].sum)%mogician;
32 }
33 inline void Work_Out(int k,int l,int r,LL mu,LL ad){
35     tr[k].mult=(tr[k].mult*mu)%mogician;
37 }
38 inline void Push_Down(int k,int l,int r){
40         return ;
41     int mid=(l+r)>>1;
45     tr[k].mult=1;
46 }
47 inline void Lazy_Tag(int k,int l,int r,int x,int y,LL mu,LL ad){
48     if(x<=l&&r<=y){
50         return ;
51     }
52     Push_Down(k,l,r);
53     int mid=(l+r)>>1;
54     if(x<=mid)
56     if(mid<y)
58     tr[k].sum=(tr[k<<1].sum+tr[k<<1|1].sum)%mogician;
59 }
60 inline LL Q(int k,int l,int r,int x,int y){
61     if(x<=l&&r<=y)
62         return tr[k].sum%mogician;
63     Push_Down(k,l,r);
64     int mid=(l+r)>>1;
65     return    ((x<=mid?Q(k<<1,l,mid,x,y)%mogician:0)+(mid<y?Q(k<<1|1,mid+1,r,x,y)%mogician:0))%mogician;
66 }
67 int m,d,x,y;
68 LL k;
69 int main(){
70
71     scanf("%lld%lld",&n,&mogician);
72     for(re int i=1;i<=n;i++){
73         scanf("%lld",&a[i]);
74         a[i]%=mogician;
75     }
76     build(1,1,n);
77     scanf("%d",&m);
78     for(re int i=1;i<=m;i++){
79         scanf("%d%d%d",&d,&x,&y);
80         if(d==3)
81             printf("%lld\n",Q(1,1,n,x,y));
82         else{
83             scanf("%lld",&k);
84             k%=mogician;
85             d==1?Lazy_Tag(1,1,n,x,y,k,0):Lazy_Tag(1,1,n,x,y,1,k);
86         }
87     }
88     return 0;
89 }```

1811 篇文章120 人订阅

0 条评论

## 相关文章

2253

2696

2413

1898

2764

### Java数据结构和算法（六）——前缀、中缀、后缀表达式

前面我们介绍了三种数据结构，第一种数组主要用作数据存储，但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具，其中在介绍栈时我们知道栈可以用来做单词逆...

2619

1324

### 1497 取余运算

1497 取余运算 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 输入...

3417

773

### 【JAVA零基础入门系列】Day10 Java中的数组

什么是数组？顾名思义，就是数据的组合，把一些相同类型的数放到一组里去。 　　那为什么要用数组呢？比如需要统计全班同学的成绩的时候，如果给班上50个同学的成绩...

2136