树状数组 MLE0分求助
查看原帖
树状数组 MLE0分求助
306560
kevinchw楼主2022/5/22 20:46
#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define lson k*2
#define rson k*2+1
#define inf 2000000000
#define ldb long double
#define db double
#define ft float
#define myset(a,b,c,d) for(int i=b;i<=c;i++)a[i]=d;
using namespace std;
int a[100005];
int n;
int c[100005];
int lowbit(int x)
{
	return x&(-x);
}
int find(int k)
{
	if(!k)return 0;
	return c[k]+find(k-lowbit(k));
}
void change(int k,int x)
{
	if(k>n)return ;
	c[k]+=x;
	change(k+lowbit(k),x);
}
void init()
{
	for(int i=2;i<=n;i++)
	{
		c[i]=find(i-1)+a[i]-find(i-lowbit(i));
	}
}
set<int> st;
signed main()
{
//	freopen("data1.txt","r",stdin);
//	freopen("data1.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
		if(a[i]>1)st.insert(i);
	}
	c[1]=a[1];
	init();
	int m;
	cin>>m;
	while(m--)
	{
		int k,l,r;
		scanf("%lld%lld%lld",&k,&l,&r);
		if(k==0)
		{
			set<int>::iterator itl=st.lower_bound(l);
			set<int>::iterator itr=(--st.upper_bound(r));
//			cout<<*itl<<' '<<*itr<<endl;
			vector<int> v;
			for(;;itl++)
			{
//				cout<<*itl<<' '<<*itr<<endl;
				int last=a[*itl],now=sqrt(a[*itl]);
				change(*itl,now-last);
				if(now<=1)v.push_back(*itl);
				a[*itl]=now;
				if(itl==itr)break;
			}
			for(int i=0;i<v.size();i++)
			{
				st.erase(st.find(v[i]));
			}
		}
		else
		{
			printf("%lld\n",find(r)-find(l-1));
		}
//		for(int i=1;i<=n*4;i++)
//		{
//			printf("[%lld,%lld]=%lld\n",t[i].l,t[i].r,t[i].sum);
//		}
	}
	return 0;
}
2022/5/22 20:46
加载中...