ABC339G 分块做法求条
  • 板块灌水区
  • 楼主crz_qwq
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/9/17 22:33
  • 上次更新2024/9/18 16:12:51
查看原帖
ABC339G 分块做法求条
795344
crz_qwq楼主2024/9/17 22:33
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5,B=2e5+5;
int a[N],L[B],R[B],pos[N];
vector<int>block[B],sum[B];
int query(int l,int r,int d)
{
	int x=pos[l],y=pos[r],ans=0;
	if(x==y)
	{
		for(int i=l;i<=r;++i)
			if(a[i]<=d)
				ans+=a[i];
		return ans;
	}
	ans+=query(l,R[x],d)+query(L[y],r,d);
	for(int i=x+1;i<y;++i)
	{
		int pos=upper_bound(block[i].begin(),block[i].end(),d)-block[i].begin()-1;
		if(block[i][pos]<=d)
			ans+=sum[i][pos];
	}
	return ans;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n,m;
	cin>>n;
	for(int i=1;i<=n;++i)
		cin>>a[i];
	int t=sqrt(n);
	for(int i=1;i<=t;++i)
		L[i]=(i-1)*t+1,R[i]=i*t;
	if(R[t]<n)
	{
		++t;
		L[t]=R[t-1]+1;
		R[t]=n;
	}
	for(int i=1;i<=t;++i)
	{
		for(int j=L[i];j<=R[i];++j)
		{
			pos[j]=i;
			block[i].emplace_back(a[j]);
		}
		sort(block[i].begin(),block[i].end());
		sum[i].emplace_back(block[i][0]);
		for(int j=1;j<(int)block[i].size();++j)
			sum[i].emplace_back(block[i][j]+sum[i][j-1]);
	}
	cin>>m;
	int lst=0;
	while(m--)
	{
		int l,r,k;
		cin>>l>>r>>k;
		l^=lst,r^=lst,k^=lst;
		cout<<(lst=query(l,r,k))<<'\n';
	}
}
2024/9/17 22:33
加载中...