<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      我使用FHQ寫了線段樹2

      雖然并沒有任何的意義,但是我覺得很有意思,所以記錄一下:

      #include <bits/stdc++.h>
      #define int long long
      using namespace std;
      const int MN=1e6+116;
      struct Node{
      	int lc, rc, siz, rnd;
      	int val, sum, addtag, multag;
      }tr[MN];
      int n, q, mod;
      void pushup(int k){
      	tr[k].siz=tr[tr[k].lc].siz+tr[tr[k].rc].siz+1;
      	tr[k].sum=tr[tr[k].lc].sum+tr[tr[k].rc].sum+tr[k].val;
      }
      void pushdown(int k){
      	if(tr[k].multag!=1){
      		if(tr[k].lc){
      			tr[tr[k].lc].val=(tr[tr[k].lc].val*tr[k].multag)%mod;
      			tr[tr[k].lc].sum=(tr[tr[k].lc].sum*tr[k].multag)%mod;
      			tr[tr[k].lc].addtag=(tr[tr[k].lc].addtag*tr[k].multag)%mod;
      			tr[tr[k].lc].multag=(tr[tr[k].lc].multag*tr[k].multag)%mod;
      		}
      		if(tr[k].rc){
      			tr[tr[k].rc].val=(tr[tr[k].rc].val*tr[k].multag)%mod;
      			tr[tr[k].rc].sum=(tr[tr[k].rc].sum*tr[k].multag)%mod;
      			tr[tr[k].rc].addtag=(tr[tr[k].rc].addtag*tr[k].multag)%mod;
      			tr[tr[k].rc].multag=(tr[tr[k].rc].multag*tr[k].multag)%mod;			
      		}
      		tr[k].multag=1;
      	}
      	if(tr[k].addtag){
      		if(tr[k].lc){
      			tr[tr[k].lc].val=(tr[tr[k].lc].val+tr[k].addtag)%mod;
      			tr[tr[k].lc].sum=(tr[tr[k].lc].sum+(tr[tr[k].lc].siz*tr[k].addtag)%mod)%mod;
      			tr[tr[k].lc].addtag=(tr[tr[k].lc].addtag+tr[k].addtag)%mod;			
      		}
      		if(tr[k].rc){
      			tr[tr[k].rc].val=(tr[tr[k].rc].val+tr[k].addtag)%mod;
      			tr[tr[k].rc].sum=(tr[tr[k].rc].sum+(tr[tr[k].rc].siz*tr[k].addtag)%mod)%mod;	
      			tr[tr[k].rc].addtag=(tr[tr[k].rc].addtag+tr[k].addtag)%mod;			
      		}
      		tr[k].addtag=0;
      	}
      	return;
      }
      void split(int k, int val, int &x, int &y){
      	if(!k){x=0; y=0; return;}
      	pushdown(k);
      	if(tr[tr[k].lc].siz<val){
      		x=k; val-=(tr[tr[k].lc].siz+1);
      		split(tr[k].rc,val,tr[k].rc,y);
      	}else{
      		y=k; split(tr[k].lc,val,x,tr[k].lc);
      	}
      	pushup(k);
      }
      int merge(int x, int y){
      	if(!x||!y) return x+y;
      	if(tr[x].rnd<tr[y].rnd){
      		pushdown(x);
      		tr[x].rc=merge(tr[x].rc,y);
      		pushup(x); return x;
      	}else{
      		pushdown(y);
      		tr[y].lc=merge(x,tr[y].lc);
      		pushup(y); return y;
      	}
      }
      int root=0, tottt=0;
      int Newnode(int val){
      	++tottt;
      	tr[tottt].siz=1;
      	tr[tottt].rnd=rand();
      	tr[tottt].multag=1;
      	tr[tottt].sum=tr[tottt].val=val%mod;
      	return tottt;
      }
      void insert(int val){
      	root=merge(root,Newnode(val));
      }
      void Update_Add(int l, int r, int val){
      	int x, y, z;
      	split(root,r,x,y);
      	split(x,l-1,x,z);
      	tr[z].sum=(tr[z].sum+(tr[z].siz*val))%mod;
      	tr[z].addtag=(tr[z].addtag+val)%mod;
      	tr[z].val=(tr[z].val+val)%mod;
      	pushdown(z);
      	root=merge(merge(x,z),y);
      	return;
      }
      void Update_Mul(int l, int r, int val){
      	int x, y, z;
      	split(root,r,x,y);
      	split(x,l-1,x,z);
      	tr[z].multag=(tr[z].multag*val)%mod;
      	tr[z].val=(tr[z].val*val)%mod;
      	tr[z].sum=(tr[z].sum*val)%mod;
      	tr[z].addtag=(tr[z].addtag*val)%mod;
      	pushdown(z);
      	root=merge(merge(x,z),y);
      	return;
      }
      int query(int l, int r){
      	int x, y, z, res=0;
      	split(root,r,x,y);
      	split(x,l-1,x,z);
      	res=tr[z].sum%mod;
      	pushdown(z);
      	root=merge(merge(x,z),y);
      	return res;
      }
      void Solve(){
      	cin>>n>>q>>mod;;
      	for(int i=1; i<=n; ++i){
      		int val; cin>>val;
      		insert(val);
      	}
      	while(q--){
      		int op, l, r, k;
      		cin>>op>>l>>r;
      		if(op==1){
      			cin>>k;
      			Update_Mul(l,r,k);
      		}else if(op==2){
      			cin>>k;
      			Update_Add(l,r,k);
      		}else{
      			cout<<query(l,r)<<'\n';
      		}
      	}
      }
      signed main(){
      	srand(time(0));
      	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
      	Solve();
      	return 0;
      }
      
      posted @ 2025-10-29 17:09  BaiBaiShaFeng  閱讀(4)  評論(0)    收藏  舉報
      Sakana Widget右下角定位
      主站蜘蛛池模板: 久久精品国产亚洲成人av| 国产亚洲精品久久久久久无亚洲| 天堂在线www天堂中文在线| 乱人伦人妻中文字幕无码久久网 | 久久精品中文字幕免费| 最新精品国产自偷在自线| 国产福利社区一区二区| 成人免费无遮挡在线播放| 亚洲av无码片在线播放| 一区二区和激情视频| 欧美亚洲熟妇一区二区三区| 亚洲中文字幕伊人久久无码| 夜夜爽77777妓女免费看| 辽宁省| 国产亚洲精品一区二区无| 亚洲人成网站18禁止无码| 一本精品中文字幕在线| 久久国内精品一区二区三区| 欧美色丁香| 亚洲av综合久久成人网| 聂拉木县| 国产精品无码a∨麻豆| 国产精品久久久久久久专区| 亚洲精品国产中文字幕| 色伦专区97中文字幕| 成人亚洲欧美成αⅴ人在线观看| 日韩一区二区三区高清视频| 国产精品视频中文字幕| AV极品无码专区亚洲AV| 国产台湾黄色av一区二区| 青青草无码免费一二三区| 国产精品日韩av在线播放| 久久无码中文字幕免费影院蜜桃| 免费高潮了好湿h视频| 亚洲精品美女一区二区| 免费费很色大片欧一二区| 少妇人妻无码专区在线视频| 女同精品女同系列在线观看| 亚洲 日本 欧洲 欧美 视频| 健康| 最新亚洲春色av无码专区|