求条分块玄1关
查看原帖
求条分块玄1关
941575
Stars_visitor_tyw楼主2024/10/8 11:32
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e6+5;
int a[N];
int L[N], R[N], pos[N], n, m, t, tag[N];
vector<int> num[N]; 
void resort(int x)
{
	num[x].clear();
	for(int i=L[x];i<=R[x];i++)
	{
		num[x].push_back(a[i]);
	}
	sort(num[x].begin(), num[x].end());
}
int sum[N];
int query(int lt, int rt, int val)
{
	int ans=0, x=pos[lt], y=pos[rt];
	if(x==y)
	{
		for(int i=lt;i<=rt;i++)
		{
			if(a[i]+tag[x]<=val)
			{
				ans+=a[i];
			}
		}
	}
	else
	{
		for(int i=lt;i<=R[x];i++)
		{
			// ans+=(a[i]+tag[x]<=val);
			if(a[i]+tag[x]<=val)
			{
				ans+=a[i];
			}
		}
		for(int i=L[y];i<=rt;i++)
		{
			if(a[i]+tag[y]<=val)ans+=a[i];
		}
		for(int i=x+1;i<y;i++)
		{
			int tmp=val-tag[i];
			ans+=sum[upper_bound(num[i].begin(),num[i].end(),tmp)-num[i].begin()];
		}
	}
	return ans;
}
int lst;
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n;
	cin>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>a[i];
		sum[i]=sum[i-1]+a[i];
    }
	cin>>n;
	t=sqrt(m);
    for(int i=1;i<=t;i++)
    {
        L[i]=(i-1)*t+1;
        R[i]=i*t;
    }
    if(R[t]<m)
    {
        t++;
        L[t]=R[t-1]+1;
        R[t]=m;
    }
    for(int i=1;i<=t;i++)
    {
        for(int j=L[i];j<=R[i];j++)
        {
            pos[j]=i;
            num[i].push_back(a[j]);
        }
    }
    for(int i=1;i<=t;i++)
    {
    	sort(num[i].begin(),num[i].end());
	}
    for(int i=1;i<=n;i++)
    {
		int x, y, c;
		cin>>x>>y>>c;
        x^=lst,y^=lst,c^=lst;
		int tmp=query(x,y,c);
		cout<<tmp<<"\n";
		lst=tmp;
    }
}
2024/10/8 11:32
加载中...