https://www.luogu.com.cn/problem/P4735


#include<bits/stdc++.h>
#define int long long

using namespace std;

int n,m;

int root[1<<20];
int tree[5000001][2];
int vis[5000001];

int tot;
int num[35],cnt;
const int POW=pow(2,29);

void work(int x)
{
    cnt=0;
    memset(num,0,sizeof(num));
    int nw=POW;
    while(nw)
    {
        num[++cnt]=(nw&x)>0;
        nw>>=1;
    }
    // cout<<cnt<<" ";
}

void add(int &p,int lastp)
{
    if(!p) p=++tot;
    int nw=p,lastnw=lastp;
    bool f=0;
    for(int i=1;i<=cnt;i++)
    {
        tree[nw][1^num[i]]=tree[lastnw][1^num[i]];

        tree[nw][num[i]]=++tot;
        nw=tree[nw][num[i]];
        lastnw=tree[lastnw][num[i]];
        if(num[i]) f=1;
        vis[nw]=vis[lastnw]+f;
    }
}

int query(int nw,int lastnw)
{
    int ans=0;
    unsigned ksm=POW;

    for(int i=1;i<=cnt;i++)
    {
        nw=tree[nw][num[i]];
        lastnw=tree[lastnw][num[i]];

        int dt=vis[tree[nw][num[i]^1]]-vis[tree[lastnw][num[i]^1]];
        if(dt>0)
        {   
            cout<<"i="<<i<<" ksm="<<ksm<<" nw="<<nw<<" lastnw="<<lastnw<<" vis[tree[nw][num[i]^1]]="<<vis[tree[nw][num[i]^1]]<<" vis[tree[lastnw][num[i]^1]]="<<vis[tree[lastnw][num[i]^1]]<<" dt="<<dt<<" \n";

            ans+=ksm;
            nw=tree[nw][num[i]^1];
            lastnw=tree[lastnw][num[i]^1];
        }
        else
        {
            nw=tree[nw][num[i]];
            lastnw=tree[lastnw][num[i]];
        }
        ksm>>=1;
    }
    // cout<<ans;
    return ans;
}

void output(int x)
{

    cout<<"x="<<x<<" ";
    for(int i=1;i<=cnt;i++)
    {
        cout<<num[i];
    }

    cout<<"\n";

    for(int i=1;i<=tot;i++)
    {
        cout<<"i="<<i<<" lp="<<tree[i][0]<<" rp="<<tree[i][1]<<" vis="<<vis[i]<<"\n";
    }


    cout<<"\n\n";
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin>>n>>m;

    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        // root[i]=++tot;

        work(x);

        add(root[i],root[i-1]);
    }

    // for(int i=1;i<=n;i++)
    // {
    //     cout<<root[i]<<" ";
    // }
    // cout<<"\n";

    while(m--)
    {
        char c;
        cin>>c;

        if(c=='A')
        {
            int x;
            cin>>x;
            n++;

            work(x);

            // output(x);

            add(root[n],root[n-1]);
        }
        else
        {
            int l,r,x;
            cin>>l>>r>>x;

            work(x);
            output(x);
            cout<<query(root[r],root[l-1])<<"\n";
        }
    }

	//mt19937_64 myrand(time(0));
	return 0;
}

/*

5 2
2 6 4 3 6
A 6 
Q 3 5 4 
*/

posted @ 2025-02-19 21:41  Wy_x  阅读(1)  评论(0)    收藏  举报