求助 ? !!

P3373 【模板】线段树 2

输出太多/少行了
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


|