求助,#2TLE,不知道哪里写挂了
查看原帖
求助,#2TLE,不知道哪里写挂了
574568
Dr_Gilbert南科蛤蟆楼主2022/3/22 17:15

#2 TLE 蒟蒻不知道哪里写挂了 求大佬帮调

#include <stdio.h>
#define int long long
long long stree[1200010],stmax[1200010];
int d[1000010],a[300010];
inline int max(int x, int y){
	return x>y?x:y;
}
void pushup(int x){
	stree[x]=stree[x<<1]+stree[x<<1|1];
	stmax[x]=max(stmax[x<<1],stmax[x<<1|1]);
	return;
}
void build(int x, int l, int r){
	int mid=l+r>>1;
	if (l==r){
		stree[x]=stmax[x]=a[l];
		return;
	}
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	return pushup(x);
}
void change(int x, int l, int r, int c){
	int mid=l+r>>1;
	if (r<c||l>c) return;
	if (l==r&&r==c){
		stree[x]=stmax[x]=d[stree[x]];
		return;
	}
	if (c<=mid) change(x<<1,l,mid,c);
	if (c>mid) change(x<<1|1,mid+1,r,c);
	pushup(x);return;
	return;
}
int query(int x, int l, int r, int ql, int qr){
	if (r<ql||l>qr) return 0;
	int mid=l+r>>1;
	if (ql<=l&&r<=qr){
		return stree[x];
	}
	int ret=0;
	if (ql<=mid) ret+=query(x<<1,l,mid,ql,qr);
	if (qr>mid) ret+=query(x<<1|1,mid+1,r,ql,qr);
	return ret;
}
signed main(){
	for (int i=1;i<=1000000;i++){
		for (int j=0;j<=1000000;j+=i){
			d[j]++;
		}
	}
	int n,m;
	scanf("%lld%lld",&n,&m);
	for (int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	for (int i=1;i<=m;i++){
		int k,l,r;
		scanf("%lld%lld%lld",&k,&l,&r);
		if (k==1){
			for (int j=l;j<=r;j++){
				change(1,1,n,j);
			}
		}else{
			printf("%lld\n",query(1,1,n,l,r));
		}
	}
	return 0;
} 
2022/3/22 17:15
加载中...