输出太多/少行了
by 小粉兔 @ 2018-03-24 17:38:30
```cpp
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
#define Fast register
ll n,m,Mod,f,x,y,k;
struct Input{
#define SIZE 20000
char BUF[SIZE],*S,*T;
Input():S(BUF),T(BUF){}
inline char Getchar(){return((S==T)&&(T=(S=BUF)+fread(BUF,1,SIZE,stdin),S==T)?EOF:*S++);}
inline Input&operator>>(char&c){return(c=Getchar(),*this);}
inline Input&operator>>(int&s){
s=0;Fast char c;
while(c=Getchar(),c<48||c>57);
while(s=s*10+c-48,c=Getchar(),c>47&&c<58);
return*this;
}
inline Input&operator>>(ll&s){
s=0;Fast char c;
while(c=Getchar(),c<48||c>57);
while(s=(ll)s*10+c-48,c=Getchar(),c>47&&c<58);
return*this;
}
#undef SIZE
}input;
struct Output{
#define SIZE 20000
char BUF[SIZE],*S,*Limit;
Output():S(BUF),Limit(BUF+SIZE){}
~Output(){fwrite(BUF,1,S-BUF,stdout);}
inline void Flush(){fwrite(BUF,1,S-BUF,stdout);S=BUF;}
inline void Putchar(const char&c){if(S==Limit)Flush();*S++=c;}
inline Output&operator<<(const char&c){return(Putchar(c),*this);}
template<class T>inline Output&operator<<(T s){
static char Stack[20];static int Top;
Top=0;do Stack[++Top]=s%10+48;while(s/=10);
while(Top)Putchar(Stack[Top--]);
return*this;
}
}output;
struct Segment_Tree{
#define maxn 1e5+3
#define l(s) s<<1
#define r(s) s<<1|1
struct Segment_Tree_Node{
ll val,add,mult;
Segment_Tree_Node (){add=0,mult=1;}
};
Segment_Tree_Node s[maxn<<2];
inline void push_up(Fast ll top)
{
s[top].val=(s[l(top)].val+s[r(top)].val)%Mod;
return;
}
inline void built(Fast ll top,Fast ll l,Fast ll r)
{
if(l==r) input>>s[l].val;
else
{
Fast ll mid=(l+r)>>1;
built(l(top),l,mid);
built(r(top),mid+1,r);
push_up(top);
}
return;
}
inline void push_down(Fast ll top,Fast ll l,Fast ll r)
{
Fast ll mid=(l+r)>>1;
//下传下标
s[l(top)].val=(s[l(top)].val*s[top].mult+s[top].add*(mid-l+1))%Mod;
s[r(top)].val=(s[r(top)].val*s[top].mult+s[top].add*(r-mid))%Mod;
//下传mult
s[l(top)].mult=(s[l(top)].mult*s[top].mult)%Mod;
s[r(top)].mult=(s[r(top)].mult*s[top].mult)%Mod;
//下传add
s[l(top)].add=(s[l(top)].add+s[top].add)%Mod;
s[r(top)].add=(s[r(top)].add+s[top].add)%Mod;
//复位
s[top].add=0,s[top].mult=1;
return;
}
inline void update_add(Fast ll top,Fast ll l,Fast ll r,Fast ll update_l,Fast ll update_r,Fast ll num)
{
if(update_l>r||update_r<l) return;
if(update_l<=l&&update_r>=r) //要更新的区间 大于整个区间,整个区间更新;
{
s[top].add=(s[top].add+num)%Mod;
s[top].val=(s[top].val+(r-l+1)*num)%Mod;
}
else //二分区间更新;
{
push_down(top,l,r);
Fast ll mid=(l+r)>>1;
update_add(l(top),l,mid,update_l,update_r,num);
update_add(r(top),mid+1,r,update_l,update_r,num);
push_up(top);
}
return;
}
inline void update_mult(Fast ll top,Fast ll l,Fast ll r,Fast ll update_l,Fast ll update_r,Fast ll num)
{
if(update_l>r||update_r<l) return;
if(update_l<=l&&update_r>=r) //要更新的区间 大于整个区间,整个区间更新;
{
s[top].add=(s[top].add*num)%Mod;
s[top].mult=(s[top].mult*num)%Mod;
s[top].val=(s[top].val+(r-l+1)*num)%Mod;
}
else
{
push_down(top,l,r);
Fast ll mid=(l+r)>>1;
update_mult(l(top),l,mid,update_l,update_r,num);
update_mult(r(top),mid+1,r,update_l,update_r,num);
push_up(top);
}
return;
}
inline ll Query(Fast ll top,Fast ll l,Fast ll r,Fast ll Query_l,Fast ll Query_r)
{
if(Query_l>r||Query_r<l) return 0;
if(Query_l<=l&&Query_r>=r) return s[top].val;
else
{
push_down(top,l,r);
Fast ll mid=(l+r)>>1;
return (Query(l(top),l,mid,Query_l,Query_r)%Mod+Query(r(top),mid+1,r,Query_l,Query_r)%Mod)%Mod;
}
}
}lwd;
int main()
{
input>>n>>m>>Mod;
lwd.built(1,1,n);
for(Fast int k=1;k<=m;k++)
{
input>>f;
if(f==1)
{
input>>x>>y>>k;
lwd.update_mult(1,x,y,1,n,k);
}
else if(f==2)
{
input>>x>>y>>k;
lwd.update_add(1,x,y,1,n,k);
}
else
{
input>>x>>y;
output<<lwd.Query(1,1,n,x,y);
putchar('\n');
}
}
return 0;
}
by Explorer_CYC @ 2018-03-28 19:29:16