MnZn求助(悬赏一关注)
查看原帖
MnZn求助(悬赏一关注)
716013
tornado01楼主2023/10/18 20:55

这是代码

#include<bits/stdc++.h>
using namespace std;
struct node{
	int l,r,fa;
	long long sum,flag=0,per=0;
}t[6000500];
long long n,q,f[200200],op,x,y,v,er[33],id=1,uu=0;
//root=1;
void push_down(int u)
{
	if(t[u].flag)
	{
		t[t[u].l].flag+=t[u].flag,t[t[u].r].flag+=t[u].flag;
		t[t[u].l].sum+=t[u].flag*t[t[u].l].per,t[t[u].r].sum+=t[u].flag*t[t[u].r].per;
		t[u].flag=0;
	}
	return ;
}
void push_up(int u)
{
	t[u].sum=t[t[u].l].sum+t[t[u].r].sum;
	t[u].per=t[t[u].l].per+t[t[u].r].per;
	return ;
}
void add(int x,int zhi)
{
	int nw=1;
	for(int i=0;i<=30;i++)
	{
		int tt=(x&(1<<i));
		//cout<<(tt>0)?1:0;
		if(tt==0) {if(t[nw].l==0) {t[nw].l=++id,t[id].fa=nw;} nw=t[nw].l;}
		else {if(t[nw].r==0) {t[nw].r=++id,t[id].fa=nw;} nw=t[nw].r;}
	}
	t[nw].sum=zhi,t[nw].per=1;
	while(t[nw].fa) nw=t[nw].fa,push_up(nw);
	return ;
}
void updata(int u,int up,int x,int zhi,int nw)
{
	if(u==0) return ;
	//cout<<u<<" "<<up<<" "<<x<<" "<<zhi<<" "<<nw<<'\n';
	if(nw>=up){t[u].flag+=t[u].per,t[u].sum+=t[u].per*zhi;return ;}
	push_down(u);
	if((x&(1<<nw))==0) updata(t[u].l,up,x,zhi,nw+1);
	else updata(t[u].r,up,x,zhi,nw+1);
	push_up(u);
	return ;
}
long long query(int u,int up,int x,int nw)
{
	if(u==0) return 0;
	//cout<<"!!!!!!!!!!!!!!!!!!!\n";
	//cout<<t[u].sum<<" "<<x<<" "<<up<<'\n';
	if(nw>=up) return t[u].sum;
	push_down(u);
	if((x&(1<<nw))==0) return query(t[u].l,up,x,nw+1);
	return query(t[u].r,up,x,nw+1);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>q,er[0]=1;
	for(int i=1;i<=30;i++) er[i]=er[i-1]*2;
	while(er[uu]<=n) uu++;
	for(int i=1;i<=n;i++) cin>>f[i],add(i,f[i]);
	long long lastans=0;
	while(q--)
	{
		cin>>op,op=(op+lastans)%2+1;
		if(op==1){cin>>x>>y>>v,y%=er[x];updata(1,min(x,uu),y,v,0);}
		else cin>>x>>y,y%=er[x],lastans=query(1,min(x,uu),y,0),cout<<lastans<<'\n';
	}
	return 0;
}
//Runtime Error.
//Received signal 8: Floating-point exception

为啥啊,似乎也没有% or / 0啊 提供hack也行

2023/10/18 20:55
加载中...