40pts树状数组求调
查看原帖
40pts树状数组求调
578029
ivyjiao楼主2024/4/14 10:39
#include<bits/stdc++.h>
using namespace std;
int n,f[100001],m,k,l,r;
long long a[100001],tree[100001];
void add(int x,long long v){
    for(int i=x;i<=n;i+=i&-i) tree[i]+=v;
}
long long query(int x){
    long long ans=0;
    for(int i=x;i;i-=i&-i) ans+=tree[i];
    return ans;
}
int find(int x){
    if(f[x]==x) return x;
    return f[x]=find(f[x]);
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        add(i,a[i]);
        f[i]=i;
    }
    cin>>m;
    f[n+1]=n+1;
    while(m--){
        cin>>k>>l>>r;
        if(l>r) swap(l,r);
        if(k==0){
            for(int i=l;i<=r;){
                add(i,(int)sqrt(a[i])-a[i]);
                a[i]=(int)sqrt(a[i]);
                if(a[i]==1) f[i]=i+1;
                if(find(f[i])==i) i++;
                else i=f[i];
            }
        }
        else cout<<query(r)-query(l-1)<<'\n';
    }
}
2024/4/14 10:39
加载中...