考前模板整理

模板栏

冰茶姬

int fa[maxn] , n , m ;
int find(int x) {
	if(fa[x] != x) fa[x] = find(fa[x]) ;
	return fa[x] ;
}
void unionn(int x ,int y) {
	x = find(x) ;
	y = find(y) ;
	fa[x] = y ;
}
int check(int x,int y) {
	x = find(x) , y = find(y) ;
	if(x == y) return 1 ;
	return 0 ;
} 
int main () {
	n = read() , m = read() ;
	for(int i = 0 ; i <= n ; i ++) fa[i] = i ;
	rep(i,1,m) {
		int opt = read() , x = read() , y = read() ;
		if(opt == 1) {
			unionn(x,y) ;
		}else {
			if(check(x,y)) puts("Y") ;
			else puts("N") ;
		}
	}
	return 0 ;
}

蛤戏

/*
	ps:本代码经过360,腾讯电脑管家,金山毒霸等权威软件严格杀毒,未携带任何病毒,请评测姬放心评测!!
*/
unsigned long long power[maxn] ;
vector <unsigned long long> v ; 
signed main () {
	n = read() ;
	power[0] = 1 ;
	for(signed i = 1 ; i <= 10001 ; i ++ ) {
		power[i] = power[i-1] * base ;
	}
	for(signed i = 1 ; i <= n ; i ++) {
		string s ;
		cin >> s ;unsigned long long ans = 0 ;
		for(signed i = s.size()-1 , cnt = 0; i >= 0 ; i --) {
			ans += int(s[i])*power[cnt] ;
			cnt ++ ; 
		}
//		cout << ans << endl ;
		v.push_back(ans) ;
	}sort(v.begin(),v.end()) ;
	unsigned long long ans = 1 ;
	for(signed i = 1 ; i < v.size() ; i ++ ) {
		if(v[i] != v[i-1]) ans ++ ;
	}
	cout << ans << endl ;
	return 0 ;
}

快速幂

int n , m , ha ;
int quick_pow(int x ,int p) {
	int res = 1 ;
	for(; p ; p >>= 1 , x = x * x % ha) {
		if(p & 1) res = res * x % ha ;
	}return res ;
}
signed main () {
	n = read() , m = read() , ha = read() ;
	printf("%lld^%lld mod %lld=%lld",n,m,ha,quick_pow(n,m)) ;
	return 0 ;
}

线性筛素数

int prime[maxn] , vis[maxn] , tot , n , m ; 
int main () {
	vis[1] = 1 ;
	n = read() , m = read() ;
	for(int i = 2 ; i <= n ; i ++) {
		if(!vis[i]) prime[++tot] = i ;
		for(int j = 1 ; j <= n && i * prime[j] <= n ; j ++) {
			vis[i*prime[j]] = 1 ;
			if(i % prime[j] == 0) break ;
		}
	}
	while(m --) {
		cout << (vis[read()] == 0 ? "Yes" : "No") << endl ;
	}
	return 0 ;
}

priority_queue<int,vector<int>,greater<int> >q ;
int n , m ;
int main () {
	m = read() ;
	while(m --) {
		int opt = read() ,x ;
		if(opt == 1) {
			x = read() ;
			q.push(x) ;
		}else if(opt == 2) {
			cout << q.top() << endl ;
		}else {
			q.pop() ;
		}
	}
	return 0 ;
}

最小生成树

struct dy {
	int x , y , z ;
	int operator < (const  dy rr) const {
		return z < rr.z ;
	} 
}a[maxm] ;
int fa[maxn] ;
int find(int x) {
	if(fa[x] != x) fa[x] = find(fa[x]) ;
	return fa[x] ;
}
void unionn(int x ,int y) {
	x = find(x) , y = find(y) ;
	fa[y] = x ;
}
int n , m ;
int main () {
	n = read() , m = read() ;
	for(int i = 0 ; i <= n ; i ++) fa[i] = i ;
	for(int i = 1 ; i <= m ; i ++) {
		a[i].x = read() ;
		a[i].y = read() ;
		a[i].z = read() ;
	}
	sort(a+1,a+1+m) ;int ans = 0 ;
	for(int i = 1 , k = 0 ; i <= m ; i ++ ) {
		if(find(a[i].x) != find(a[i].y)) {
			unionn(a[i].x,a[i].y) ;
			k ++ ;
			ans += a[i].z ;
		}if(k == n-1) break ;
	}
	cout << ans <<endl ;
	return 0 ;
}

裴蜀定理

int main() {
	n = read() ;int ans=0;
	for(int i = 1 ; i <= n ; i ++){
		x = read() ;
		ans = gcd(ans,x) ;
	}
	cout << abs(ans) << endl ;
	return 0 ;
}
int gcd(int a,int b) {
	return b==0? a:gcd(b,a%b) ; 
}

spfa

struct dy {
	int x , y , z , next ;
}a[maxm] ;
int head[maxn] , dis[maxn] , vis[maxn] ;
void add(int x ,int y ,int z) {
	a[++t].x = x ;
	a[t].y = y ;
	a[t].z = z ;
	a[t].next = head[x] ;
	head[x] = t ;
}
queue<int>q ;
void spfa(int s) {
	while(q.size()) q.pop() ;
	for(int i = 0 ; i <= n ; i ++) dis[i] = 2147483647 ; 
//	cout << dis[s] << "*\n" ;
	dis[s] = 0 ;
	vis[s] = 1 ; 
	q.push(s) ;
	while(!q.empty()) { 
		int u = q.front() ;
		q.pop() ;
		vis[u] = 0 ;
		for(int i = head[u] ; i ; i = a[i].next) {
			int v = a[i].y ;
			if(dis[v] > dis[u] + a[i].z) {
				dis[v] = dis[u] + a[i].z ;
				if(!vis[v]) {
					vis[v] = 1 ;
					q.push(v) ;
				}
			}
		}
	}
} 
int main () {
	n = read() , m = read() , s = read() ;
	for(int i = 1 ; i <= m ; i ++) {
		int x = read() , y = read() , z = read() ;
		add(x,y,z) ;
	}
	spfa(s) ;
	return 0 ;
}

树状数组---单点修改区间查询

int n , m , tree[maxn] ;
int lowbit(int x) {
	return x & (-x) ;
}
void update(int x ,int k) {
	for(int i = x ; i <= n ; i += lowbit(i)) {
		tree[i] += k ; 
	}
}
int query(int x) {
	int res = 0 ;
	for(int i = x ; i ; i -= lowbit(i)) {
		res += tree[i] ;
	}return res ;
}
int main () {
	n = read() , m = read() ;
	for(int i = 1 ; i <= n ; i ++) {
		int x = read() ;
		update(i,x) ;
	}
	while(m --) {
		int opt = read() , x = read() , y = read() ;
		if(opt == 1) {
			update(x,y) ;
		}else {
			printf("%d\n",query(y)-query(x-1)) ;
		}
	}
	return 0 ;
}

树状数组2

int n , m , tree[maxn] ;
int lowbit(int x) {
	return x & (-x) ;
}
void update(int x,int k) {
	for(int i = x ; i <= n ; i += lowbit(i)) {
		tree[i] += k ;
	}
}
int query(int x) {
	int res = 0 ;
	for(int i = x ; i ; i -= lowbit(i)) {
		res += tree[i] ;
	}return res ;
}
int a[maxn] ;
int main () {
	n = read() , m = read() ;
	for(int i = 1 ; i <= n ; i ++) {
		a[i] = read() ;
		update(i,a[i]-a[i-1]) ;
	}
	while(m --) {
		int opt = read() ;
		if(opt == 1) {
			int l = read() , r = read() , k = read() ;
			update(l,k) ;
			update(r+1,-k) ;
		}else {
			int x = read() ;
			cout << query(x) << endl ;
		}
	}
	return 0 ;
}

ST表

const int maxn = 1e5+100 ;
int read() {
	int x = 0 , f = 1 ; char s = getchar() ;
	while(s > '9' || s < '0') {if(s == '-') f = -1 ; s = getchar() ;}
	while(s <='9' && s >='0') {x = x * 10 + (s-'0'); s = getchar() ;}
	return x*f ;
}
int n , m , a[maxn] , f[maxn][30] ;
signed main () {
	n = read() , m = read() ;
	for(int i = 1 ; i <= n ; i ++) {
		f[i][0] = read() ;
	} 
	for(int j = 1 ; j <= 23 ; j ++) {
		for(int i = 1 ; i+(1<<j)-1 <= n ; i ++) {
			f[i][j] = max(f[i][j-1],f[i+(1<<(j-1))][j-1]) ;
		}
	}
	while(m --) {
		int l = read() , r = read() ;
		int t = log(r-l+1)/log(2) ;
		printf("%lld\n",max(f[l][t],f[r+1-(1<<t)][t]));
	} 
	return 0 ;
}

看猫片

char s[maxn] , t[maxn] ;
int p[maxn] ;
int main () {	
	scanf("%s%s",s+1,t+1) ;
	int j = 0 ;
	p[0] = 0 ;
	int n = strlen(s+1) , m = strlen(t+1) ; 
	for(int i = 1 ; i < m ; i ++) {
		while(j > 0 && t[i+1] != t[j+1]) j = p[j] ;
		if(t[i+1] == t[j+1]) j ++ ;
		p[i+1] = j ;
	}
	j = 0 ;
	for(int i = 0 ; i < n ; i ++) {
		while(j > 0 && s[i+1] != t[j+1]) j = p[j] ;
		if(t[j+1] == s[i+1]) j ++ ;
		if(j == m) {
			cout << i - m + 2 << endl ;
			j = p[j] ;
		}
		
	}
	for(int i = 1 ; i <= m ; i ++) {
		cout << p[i] << " " ;
	}
	return 0 ;
}

线性求逆元

signed main () {
	n = read() , p = read() ;
	fac[1] = 1 ;
	puts("1") ;
	for(int i = 2 ; i <= n ; i ++) {
		fac[i] = (p-p/i) * fac[p%i] % p ;
		printf("%lld\n",fac[i]) ;
	}
	return 0 ;
}

线段树1

struct dy {
	int lc , rc , sum ,tag ;
}tree[maxn*2+100] ;
int a[maxn] , n , m , t = 1 ;
void pushup(int u ) {
	tree[u].sum = tree[tree[u].lc].sum + tree[tree[u].rc].sum ;
	return ;
}
void pushdown(int u ,int l ,int r) {
	int mid = (l+r) >> 1 ;
	tree[tree[u].lc].sum += tree[u].tag * (mid-l+1) ;
	tree[tree[u].lc].tag += tree[u].tag ;
	tree[tree[u].rc].sum += tree[u].tag * (r-mid) ;
	tree[tree[u].rc].tag += tree[u].tag ;
	tree[u].tag = 0 ;
}
void build(int u ,int l ,int r) {
	if(l == r) {
		tree[u].sum = a[l] ;
		tree[u].tag = 0 ;
		return ;
	}
	int mid = (l+r) >> 1 ;
	++ t ;
	tree[u].lc = t ;
	build(tree[u].lc,l,mid) ;
	++t ;
	tree[u].rc = t ;
	build(tree[u].rc,mid+1,r) ;
	pushup(u) ;
}
void update(int u ,int l ,int r ,int ll ,int rr ,int w) {
	if(l == ll && r == rr) {
		tree[u].tag += w ;
		tree[u].sum += w * (r-l+1) ;
		return ;
	}
	int mid = (l+r)/2 ;
	pushdown(u,l,r) ;
	if(rr <= mid) update(tree[u].lc,l,mid,ll,rr,w) ;
	else if(ll > mid) update(tree[u].rc,mid+1,r,ll,rr,w) ;
	else {
		update(tree[u].lc,l,mid,ll,mid,w) ;
		update(tree[u].rc,mid+1,r,mid+1,rr,w) ; 
	}
	pushup(u) ;
}
int query(int u ,int l ,int r ,int ll ,int rr ) {
	if(l == ll && r == rr) {
		return tree[u].sum ;
	}
	int mid = (l+r) / 2 ;
	pushdown(u,l,r) ;
	if(rr <= mid) return query(tree[u].lc,l,mid,ll,rr) ;
	else if(ll > mid) return query(tree[u].rc,mid+1,r,ll,rr) ;
	else {
		return query(tree[u].lc,l,mid,ll,mid) + query(tree[u].rc,mid+1,r,mid+1,rr);
	}
	pushup(u) ;
}
signed main () {
	n = read() , m = read() ;
	for(int i = 1 ; i <= n ; i ++) {
		a[i] = read() ;
	}
	build(1,1,n) ;
	while(m --) {
		int opt = read() , x = read() , y = read() ;
		if(opt == 1) {
			int k = read() ;
			update(1,1,n,x,y,k) ;
		}else {
			cout << query(1,1,n,x,y) << endl;
		}
	}
	return 0 ;
}

LCA

/*
	ps:本代码经过360,腾讯电脑管家,金山毒霸等权威软件严格杀毒,未携带任何病毒,请评测姬放心评测!!
*/
int n , m , s , f[maxn][30] , dep[maxn] , vis[maxn] , head[maxn] ;
struct dy {
	int x , y , next ;
}a[maxn*2] ;int t ;
void dfs(int u ,int fa) {
	dep[u] = dep[fa] + 1 ;
	f[u][0] = fa ;
	for(int i = 1 ; i <= 23 ; i ++) {
		f[u][i] = f[f[u][i-1]][i-1] ;
	}
	for(int i = head[u] ; i ; i = a[i].next) {
		int v = a[i].y ;
		if(v != fa) {
			dfs(v,u) ;
		}
	}
}
void add(int x ,int y) {
	a[++t].x = x ;
	a[t].y = y ;
	a[t].next = head[x] ;
	head[x] = t ;
}
int lca(int x ,int y) {
	if(dep[x] < dep[y]) swap(x,y) ;
	for(int i = 21 ; i >= 0 ; i --) {
		if(dep[f[x][i]] >= dep[y]) {
			x = f[x][i] ;
		}
	}
	for(int i = 21 ; i >= 0 ; i --) {
		if(f[x][i] != f[y][i]) {
			x = f[x][i] ;
			y = f[y][i] ;
		}
	}
	if(x == y) return x ;
	return f[x][0] ;
}
int main () {
	n = read() , m = read() , s = read() ;
	for(int i = 1 ; i < n ; i ++ ) {
		int x = read() , y = read() ;
		add(x,y) ;
		add(y,x) ;
	}
	dfs(s,0);
	while(m --) {
		int x = read() , y = read() ;
		printf("%d\n",lca(x,y)) ;
	}
	return 0 ;
}

匈牙利算法

int dfs(int u) {
	
	for(int i = head[u] ; i ;i = a[i].next) {
		int v = a[i].y ;
		if(!vis[v]) {
			vis[v] = 1 ;
			if(!match[v] || dfs(match[v])) {
				match[v] = u ;
				return 1 ;
			}
		}
	}
	return 0 ;
}
int main() {
	cin >> n >> m >> e;
	for(int i = 1 ; i <= e ; i ++) {
		int x , y , z ;
		cin >> x >> y ;
		if(x > n || y > m) continue ;
		add(x,y) ;
	}
	int sum = 0 ;
	for(int i = 1 ; i <= n ; i ++) {
		memset(vis,0,sizeof(vis)) ;
		if(dfs(i)) sum ++ ;
	}
	cout << sum << endl ;
	return 0;
}

拓扑排序和tajan缩点

void dfs(int u ) {
	dfn = low  = ++tim 
	instack=1
	for(....) {
		if(!insatck) {
			dfs(...)
			low = min (low , low) ;
		}else if(instack) {
			low = min (low,dfn) ;
		}
	}
	if(low == dfn) {
		++num ;
		while(s.top != u) {
			col[s.top] = num ;
			s.pop ;
		}
		s.pop ;
	}
}
int topsort() {
	for(....) {
		if(!in) 
			q.push(i) ;
	}
	while(!q.empty) {
		u = q.front
		q.pop 
		for(....) {
			v = a[i].y;
			in[v] -- ;
			if(!in[v]) q.push(v) ;
 		}
	}
}

线性筛phi

phi[1] = 1 ;
for(int i = 2 ; i <= n ; i ++) {
	if(!vis[i]) {
		prime[++num] = i ;
		phi[i] = i-1 ;
	}
	for(int j = 1 ; j <= num && i*prime[j] <= n ; j ++) {
		vis[i*prime[j]] = 1 ;
		if(i % prime[j] == 0) {
			phi[i*prime[j]] = phi[i] * prime[j] ;
			break ; 
		}else phi[i*prime[j]] = phi[i] * (prime[j]-1) ;
	}
}

dijkstra

priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q ;
struct dy {
	int x , y , z , next ;
}a[maxn] ;
int head[maxn] , dis[maxn] , vis[maxn] , t ;
void add(int x ,int y ,int z) {
	a[++t].x = x ;
	a[t].y = y ;
	a[t].z = z ;
	a[t].next = head[x] ;
	head[x] = t ;
}
void dijkstra(int s) {
	while(q.size()) q.pop() ;
	memset(dis,0x3f,sizeof dis) ;
	dis[s] = 0 ;
	vis[s] = 0 ;
	q.push(make_pair(dis[s],s)) ;
	while(!q.empty()) {
		int u = q.top().second ;
		q.pop() ;
		if(vis[u]) continue ;
		vis[u] = 1 ;
		for(int i = head[u] ; i ; i = a[i].next) {
			int v = a[i].y ;
			if(dis[v] > dis[u] + a[i].z) {
				dis[v] = dis[u] + a[i].z ;
				q.push(make_pair(dis[v],v)) ;
			}
		}
	}
}
int n , m , s ;
signed main () {
	n = read() , m = read() , s = read() ;
	while(m --) {
		int x = read() , y = read() , z = read() ;
		add(x,y,z) ;
	}
	dijkstra(s) ;
	for(int i = 1 ; i <= n ; i ++) {
		printf("%lld ",dis[i]) ;
	}
	return 0 ;
}

有理数取余

const int ha = 19260817 ; 
int a , b ;
int quick_pow (int x ,int p) {
	int res = 1 ;
	for( ; p ; p >>= 1 , x = x * x % ha ) {
		if(p & 1) res = res * x % ha ;
	}return res ;
} 
signed main () {
	a = read() , b = read() ;
	if(!b) {
		cout << "Angry!\n" ;
		return 0 ;
	}
	cout << (a*quick_pow(b,ha-2)%ha+ha)%ha <<endl;
	return 0 ;
}

割点

struct dy {
	int x , y , next ;
}a[maxn] ;
int t , head[maxn] , dfn[maxn] , tim , low[maxn] , vis[maxn] , n , m , ans[maxn] ;
void add(int x ,int y) {
	a[++t].x = x ;
	a[t].y = y ;
	a[t].next = head[x] ;
	head[x] = t ;
}
void tarjan(int u ,int fa) {
	dfn[u] = low[u] = ++tim ;int num = 0 ;
	for(int i = head[u] ; i ; i = a[i].next) {
		int v = a[i].y ;
		if(!dfn[v]) {
			tarjan(v,fa) ;
			low[u] = min(low[u],low[v]) ; 
			if(low[v] >= dfn[u] && u != fa) {
				ans[u] = 1 ;		
			} 
			if(u == fa) num ++ ;
		}low[u] = min(dfn[v],low[u]) ;
	}
	if(u == fa && num >= 2) {
		ans[u] = 1 ;
	} 
}
int main () {
	n = read() , m = read() ;
	for(int i = 1 ; i <= m ; i ++) {
		int x = read() , y = read() ;
		add(x,y) ;
		add(y,x) ;
	}
	int sum = 0 ;
	for(int i = 1 ; i <= n ; i ++) {
		if(!dfn[i]) 
			tarjan(i,i) ;
	}
	for(int i = 1 ; i <=n ; i ++) {
		if(ans[i]) sum ++ ;
	}
	cout << sum << endl ;
	for(int i = 1 ; i <= n ; i ++) {
		if(ans[i]) cout << i << " " ;
	}
	return 0 ;
}

负环

int n , m , T ;
struct dy {
	int x , y , z , next ;
}a[maxn] ;
int head[maxn] , vis[maxn] , dis[maxn] , num[maxn] ;
queue<int>q ;
int spfa() {
	while(!q.empty()) q.pop() ;
	memset(dis,0x3f,sizeof dis) ;
	memset(vis,0,sizeof vis) ;
	memset(num,0,sizeof num) ;
	vis[1] = 1 ;
	dis[1] = 0 ;
	num[1] = 0 ;
	q.push(1) ;
	while(!q.empty()) {
		int u = q.front() ;
		q.pop() ;
		vis[u] = 0 ;
		for(int i = head[u] ; i ; i = a[i].next ) {
			int v = a[i].y ;
			if(dis[v] > dis[u] + a[i].z) {
				dis[v] = dis[u] + a[i].z ;
				num[v] = num[u] + 1 ;
				if(num[v] >= n) return 1 ;
				if(!vis[v]) {
					vis[v] = 1 ;
					q.push(v) ;
				}
			}
		}
	}
	return 0 ;
}
int t ;
void add(int x ,int y ,int z) {
	a[++t].x = x ;
	a[t].y = y ;
	a[t].z = z ;
	a[t].next = head[x] ;
	head[x] = t ;
}  
int main () {
	T = read() ;
	while(T --) {
		memset(head,0,sizeof head) ;
		memset(a,0,sizeof a) ;
		memset(num,0,sizeof num) ;
		t = 0 ;
		n = read() , m = read() ;
		while(m --) {
			int x = read() , y = read() , z = read() ;
			add(x,y,z) ;
			if(z >= 0) add(y,x,z) ;
		}
		if(spfa() ) puts("YE5") ;
		else puts("N0") ;
	}
	return 0 ;
}

线段树2

int t = 1 ;
int opt , x , y , z , n , m  , ha ,a[maxn] , ans ;
void pushup(int u) {
	tree[u].sum = (tree[tree[u].lc].sum+tree[tree[u].rc].sum) % ha ;
	tree[u].mul = 1 ;
	return ;
}
int read() {
	int x = 0 , f = 1 ; char s = getchar() ;
	while(s > '9' || s < '0') {if(s == '-') f = -1 ; s = getchar() ;}
	while(s <='9' && s >='0') {x = x * 10 + (s-'0'); s = getchar() ;}
	return x*f ;
}
void pushdown(int u ,int l,int r) {
	int mid = (l+r) / 2 ;
	tree[tree[u].lc].mul = (tree[u].mul*tree[tree[u].lc].mul)%ha ;
	tree[tree[u].rc].mul = (tree[tree[u].rc].mul*tree[u].mul)%ha ;
	tree[tree[u].lc].tag = (tree[tree[u].lc].tag*tree[u].mul)%ha ;
	tree[tree[u].rc].tag = (tree[tree[u].rc].tag*tree[u].mul)%ha  ;
	tree[tree[u].lc].sum = (tree[tree[u].lc].sum*tree[u].mul)%ha ;
	tree[tree[u].rc].sum = (tree[tree[u].rc].sum*tree[u].mul)%ha ;
	tree[tree[u].lc].sum = (tree[tree[u].lc].sum + tree[u].tag*(mid-l+1)%ha)%ha ;	
	tree[tree[u].rc].sum = (tree[tree[u].rc].sum + tree[u].tag*(r-mid)%ha)%ha ;
	tree[tree[u].lc].tag = (tree[tree[u].lc].tag + tree[u].tag) % ha ;
	tree[tree[u].rc].tag = (tree[tree[u].rc].tag + tree[u].tag) % ha ;
	tree[u].mul = 1 ;	
	tree[u].tag = 0 ;
}
void build(int u ,int l ,int r) {
	if(l == r) {
		tree[u].mul = 1 ;
		tree[u].sum = a[l] ;
		tree[u].tag = 0 ;
		return ;
	}
	int mid = (l+r) / 2 ;
	tree[u].lc = ++t ;
	build(tree[u].lc,l,mid) ;
	tree[u].rc = ++t ;
	build(tree[u].rc,mid+1,r) ;
	pushup(u) ;
}
void update(int u ,int l ,int r ,int ll ,int rr ,int w) {
	if(l == ll && r == rr) {
		tree[u].sum = (tree[u].sum + (r-l+1)*w%ha)%ha ;
		tree[u].tag = (tree[u].tag + w) % ha ;
		return ;
	}
	int mid = (l+r) / 2 ;
	pushdown(u,l,r) ;
	if(rr <= mid) update(tree[u].lc,l,mid,ll,rr,w) ;
	else if(ll > mid) update(tree[u].rc,mid+1,r,ll,rr,w) ;
	else {
		update(tree[u].lc,l,mid,ll,mid,w) ;
		update(tree[u].rc,mid+1,r,mid+1,rr,w) ;
	}
	pushup(u) ;
}
void muldate(int u,int l,int r,int ll,int rr,int w) {
	if(l == ll && r == rr) {
		tree[u].sum = (tree[u].sum*w)%ha ;
		tree[u].mul = (tree[u].mul*w)%ha ;
		tree[u].tag = (tree[u].tag*w)%ha ;
		return ;
	}
	int mid = (l+r) / 2 ;
	pushdown(u,l,r) ;
	if(rr <= mid) muldate(tree[u].lc,l,mid,ll,rr,w) ;
	else if(ll > mid) muldate(tree[u].rc,mid+1,r,ll,rr,w) ;
	else {
		muldate(tree[u].lc,l,mid,ll,mid,w) ;
		muldate(tree[u].rc,mid+1,r,mid+1,rr,w) ;
	}
	pushup(u) ;
	return ;
}
int query(int u,int l ,int r ,int ll ,int rr) {
	if(l == ll && r == rr) {
		return tree[u].sum ;
	}
	int mid = (l+r) / 2 ;
	pushdown(u,l,r) ;
	if(rr <= mid) return query(tree[u].lc,l,mid,ll,rr) ;
	else if(ll > mid) return query(tree[u].rc,mid+1,r,ll,rr) ;
	else {
		return query(tree[u].lc,l,mid,ll,mid) + query(tree[u].rc,mid+1,r,mid+1,rr) ;
	}
	pushup(u) ;
	//return ;
}
signed main() {
	n = read() , m = read() , ha = read() ;
	for(int i = 1 ; i <= n ; i ++) {
		a[i] = read() ;
	}build(1,1,n) ;
	for(int i = 1 ; i <= m ; i ++) {
		opt = read() ;
		if(opt == 1) {
			x = read() , y = read() , z = read() ;
			muldate(1,1,n,x,y,z) ;
		}else if(opt == 2) {
			x = read() , y = read() , z = read() ;
			update(1,1,n,x,y,z) ;
		}else if(opt == 3){
			x = read() , y = read() ;
			ans = 0 ;
			ans = query(1,1,n,x,y) ;
			cout << ans % ha <<endl ;
		}
	}
	return 0;
}

posted @ 2019-11-10 09:25  _L_Y_T  阅读(164)  评论(1编辑  收藏  举报