求卡常
查看原帖
求卡常
848964
hzoi_Shadow楼主2023/5/20 21:16
#include<bits/stdc++.h>
using namespace std;
long long int a[400002],c[400002],f[400002]; 
long long int lowbit(long long int x) 
{
	return (x&(-x));
}
long long int find(long long int x)
{
	if(f[x]==x)
	{
		return x;
	}
	else
	{
		return f[x]=find(f[x]);
	} 
}
long long int getsum(long long int x)
{
	long long int ans=0,i;
	for(i=x;i>0;i-=lowbit(i))
	{
		ans+=c[i];
	}
	return ans;
} 
void add(long long int n,long long int x,long long int key)
{
	long long int i;
	for(i=x;i<=n;i+=lowbit(i))
	{
		c[i]+=key;
	}
} 
int main()
{
	long long int n,m,i,pd,l,r,num,sum=0;
    while(cin>>n)
    {
        sum++;
        memset(c,0,sizeof(c));
        for(i=1;i<=n;i++)
        {
            cin>>a[i];
            f[i]=i;
            add(n,i,a[i]);
        }
        f[n+1]=n+1;
        cin>>m;
        cout<<"Case #"<<sum<<":"<<endl;
        for(i=1;i<=m;i++) 
        {
            cin>>pd>>l>>r;
            if(l>r)
            {
                swap(l,r);
            }
            if(pd==0)
            {
                while(l<=r)
                {
                    num=sqrt(a[l]);
                    add(n,l,num-a[l]);
                    a[l]=num;
                    if(a[l]<=1)
                    {
                        f[l]=l+1;
                        l=find(f[l]);
                    } 
                    else
                    {
                        f[l]=l;
                        l++;
                    }
                } 
            } 
            if(pd==1) 
            {
                cout<<getsum(r)-getsum(l-1)<<endl;
            }
        }
        cout<<endl;
    }
	return 0;
}
2023/5/20 21:16
加载中...