树状数组+FHQTreap15pts求调
查看原帖
树状数组+FHQTreap15pts求调
940146
Thewilloffire楼主2025/8/5 14:58
#include<bits/stdc++.h>
#define lid tr[id].l
#define rid tr[id].r
using namespace std;
const int maxn=500010;
const int MAXN=40000010;
int n,m,a[maxn],q[maxn],op,l,r,x;
vector<int> g[maxn];
long long num;
struct FHQ{
	int l,r;
	int root,size,v,p;
}tr[MAXN];
long long cnt,cur;

int add(int x){
	num++;
	tr[num].l=tr[num].r=0;
	tr[num].size=1;
	tr[num].p=rand();
	tr[num].v=x;
	return num;
}
void pushup(int id){
	tr[id].size=tr[lid].size+tr[rid].size+1;
}
void split_v(int id,int x,int &l,int &r){
	if(!id){
		l=r=0;
		return;
	}
	if(tr[id].v<=x){
		split_v(rid,x,rid,r);
		l=id;
	}else{
		split_v(lid,x,l,lid);
		r=id;
	}
	pushup(id);
}

void split_s(int id,int x,int &l,int &r){
	if(!id){
		l=r=0;
		return;
	}
	if(tr[lid].size>=x){
		split_s(lid,x,l,lid);
		r=id;
	}else{
		split_s(rid,x-tr[lid].size-1,rid,r);
		l=id;
	}
	pushup(id);
}
int build(int l,int r,int*p){
    if(l>r) return 0;
    int mid=(l+r)>>1;
	int v=p[mid];
	int ret=add(v);
    tr[ret].l=build(l,mid-1,p);
    tr[ret].r=build(mid+1,r,p);
    pushup(ret);
    return ret;
}
int merge(int x,int y){
	if(!x||!y){
		return x+y;
	}
	if(tr[x].p>tr[y].p){
		tr[x].r=merge(tr[x].r,y);
		pushup(x);
		return x;
	}else{
		tr[y].l=merge(tr[y].l,x);
		pushup(y);
		return y;
	}
}
#define bit(x) x&(-x) 
long long sum[maxn];
void modify(int x,int v){
	while(x<=n){
		sum[x]+=v;
		x+=bit(x);
	}
}
long long query(int x){
	long long res=0;
	while(x){
		res+=sum[x];
		x-=bit(x);
	}
	return res;
}
void dfs(int id,int v){
    if(!id) return;
    if(lid) dfs(lid,v);
    if(a[tr[id].v]%v==0){
    	modify(tr[id].v,-a[tr[id].v]);
		a[tr[id].v]/=v;
		modify(tr[id].v,a[tr[id].v]);
		q[++cnt]=tr[id].v;
	}
    if(rid) dfs(rid,v);
}
void del(int x,int l,int r){
    int a,b,c;
    split_v(tr[x].root,r,b,c);
    split_v(b,l-1,a,b);
    cur=0;
	int t=0;
	dfs(b,x);
    t=build(1,cur,q);
    tr[x].root=merge(a,merge(t,c));
}
int main(){
	srand(time(0));
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		modify(i,a[i]);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j*j<=a[i];j++){
			if(a[i]%j==0){
				g[j].push_back(i);
				if(j*j!=a[i]) g[a[i]/j].push_back(i);
			}
		}	
	}
	for(int i=1;i<=500000;i++){
		cur=0;
        for(vector<int>::iterator it=g[i].begin();it!=g[i].end();it++) q[++cur]=*it;
        tr[i].root=build(1,cur,q);
	}
	for(int i=1;i<=m;i++){
		cin>>op>>l>>r;
		if(op==1){
			cin>>x;
			if(x>1) del(x,l,r);
		}else{
			cout<<query(r)-query(l-1)<<endl;
		}
	}
	return 0;	
}
2025/8/5 14:58
加载中...