K – Ragdoll

K – Ragdollhttps://codeforces.com/gym/102832/problem/KOncetherewasalovelyragdollcat,namedLittleZara,wholikedtreesandmath.OnedayshemetthedogeAdam.Adamhadjustplantedsometreeseachconsistingofonlyonenode.Thenodeswerenumberedfrom11.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

https://codeforces.com/gym/102832/problem/K

Once there was a lovely ragdoll cat, named Little Zara, who liked trees and math. One day she met the doge Adam. Adam had just planted some trees each consisting of only one node. The nodes were numbered from 11 to nn, and the ii-th node was assigned a value aiai. Adam liked pairing tree nodes, but he disliked some node pairs. A pair of nodes (i,j)(i,j) was considered bad if ii and jj were in the same tree and gcd(ai,aj)=ai⊕ajgcd⁡(ai,aj)=ai⊕aj, where gcd(x,y)gcd⁡(x,y) denotes the greatest common divisor (GCD) of integers xx and yy, and ⊕⊕ denotes the bitwise XOR operation. Adam wondered how many bad pairs there were in his forest.

Zara was good at solving problems about trees and math, so she could answer Adam’s question in a short time. However, Adam was so naughty a dog that he would repeatedly change the forest slightly and ask Zara his question again after the change.

The changes Adam might make are listed here:

  1. Adam plants a new tree with only one node numbered xx and assigned a value vv.
  2. Adam uses magic to merge the tree containing the node xx and the one containing the node yy. If xx and yy are in the same tree before the operation, the magic fails and has no effect.
  3. Adam changes the value of node xx to vv.

 

Now you are expected to help Zara answer all questions Adam asked, in order that they could sing and dance together happily.

Input

The first line contains two integers nn and mm (1≤n≤1051≤n≤105, 1≤m≤2×1051≤m≤2×105), representing the number of nodes in the original forest and the number of changes Adam would make, respectively.

The next line contains nn integers a1,a2,…,ana1,a2,…,an (1≤ai≤2×1051≤ai≤2×105).

Each of the next mm lines describes a change Adam made, starting with an integer tt (1≤t≤31≤t≤3) representing the type of the change.

 

  • If t=1t=1, it will be followed by two integers xx and vv (n<x≤n+mn<x≤n+m, 1≤v≤2×1051≤v≤2×105). It is guaranteed that xx’s are distinct in all changes of the first type.
  • If t=2t=2, it will be followed by two integers xx and yy (1≤x,y≤n+m1≤x,y≤n+m). It is guaranteed that the node xx and yy already exist in the forest.
  • If t=3t=3, it will be followed by two integers xx and vv. (1≤x≤n+m1≤x≤n+m, 1≤v≤2×1051≤v≤2×105). It is guaranteed that the node xx already exists in the forest.

 

Output

For each change Adam made, print one line with a single integer, representing the number of bad pairs in the forest after the change.

Examples

Input

3 6
3 2 1
2 1 2
1 5 3
2 1 2
2 3 2
2 5 1
3 3 2

Jetbrains全家桶1年46,售后保障稳定

Output

1
1
1
1
2
4

Input

10 6
6 6 4 7 7 4 6 4 6 5
2 5 1
2 10 7
2 8 7
2 7 2
2 6 2
2 9 1

Output

1
1
3
4
7
8

代码:

#include<bits/stdc++.h>
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
#define endl '\n'
#define ps puts("###")
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int MAXN = 1e6+10;
const double EPS = 1e-12;
const ll mod = 1e9+7;
vector<ll>q[MAXN];
ll n,m,t,s;
ll a[MAXN];
ll fa[MAXN];
ll num[MAXN];
unordered_map<ll,ll>f[MAXN];
int fin(int x)
{
    if(fa[x]==x)
        return x;
    fa[x]=fin(fa[x]);
    return fa[x];
}
void un(int x,int y)
{
    ll p1=fin(x),p2=fin(y);
    fa[p1]=p2;
    //cout<<p1<<" "<<p2<<endl;
    for(auto i:f[p1])
    {
        ll id=i.first;
        //cout<<id<<endl;
        for(int k=0;k<q[id].size();k++)
        {
            ll u=q[id][k];
            //cout<<u<<endl;
            if(f[p2].count(u))//删了就T不知道为什么
            s+=i.second*f[p2][u];
            //cout<<s<<endl;
        }
    }
    for(auto i:f[p1])
    {
        ll id=i.first;
        f[p2][id]+=i.second;
    }
    f[p1].clear();
    num[p2]+=num[p1];
    return;
}
int main()
{
    scanf("%lld %lld",&n,&m);
    for(int i=1;i<=200000;i++)
    {
        for(int j=i+i;j<=200000;j+=i)
        {
            if((j^(j-i))==i)
            {
                q[j].push_back(i^j);
                q[i^j].push_back(j);
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        f[i][a[i]]=1;
        fa[i]=i;
        num[i]=1;
    }
    s=0;
    for(int i=1;i<=m;i++)
    {
        scanf("%lld",&t);
        if(t==1)
        {
            ll x,v;
            scanf("%lld %lld",&x,&v);
            a[x]=v;
            fa[x]=x;
            f[x][v]=1;
            num[x]=1;
            printf("%lld\n",s);
        }
        else if(t==2)
        {
            ll x,y;
            scanf("%lld %lld",&x,&y);
            ll p1,p2;
            p1=fin(x);
            p2=fin(y);
            if(p1!=p2)
            {
                if(num[p1]<num[p2])
                un(p1,p2);
                else
                un(p2,p1);
            }

            printf("%lld\n",s);
        }
        else if(t==3)
        {
            ll x,v;
            scanf("%lld %lld",&x,&v);
            for(int k=0;k<q[a[x]].size();k++)
            {
                ll u=q[a[x]][k];
                s-=f[fa[x]][u];
            }
            f[fa[x]][a[x]]--;
            a[x]=v;
            //cout<<s<<endl;
            for(int k=0;k<q[a[x]].size();k++)
            {
                ll u=q[a[x]][k];
                s+=f[fa[x]][u];
            }
            f[fa[x]][a[x]]++;
            printf("%lld\n",s);
        }
    }
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215872.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • “ORA-01017(:用户名/口令无效; 登录被拒绝)”解决办法「建议收藏」

    “ORA-01017(:用户名/口令无效; 登录被拒绝)”解决办法「建议收藏」报错:ORA-01017(:用户名/口令无效;登录被拒绝)1.打开CMD命令窗,输入sqlplus/assysdba1)修改密码SQL>alteruser用户名identifiedby密码2)用户被锁定,解锁ALTERUSERusernameACCOUNTUNLOCK;再次登录验证,成功…

    2022年6月1日
    231
  • 软件测试中根据测试用例设计的方法,测试用例设计方法有哪些?举例说明[通俗易懂]

    软件测试中根据测试用例设计的方法,测试用例设计方法有哪些?举例说明[通俗易懂]众所周知,测试用例是编制的一组测试输入、执行条件及预期结果,专门为的是某个特殊目标,即测试某个程序路径,或是核实是否满足某个特定的需求。一般来讲,常用的测试用例设计方法有五种,分别是:正交实验法、边界值分析法、等价类划分法、判定表法、错误推测法。当然测试用例的设计方法不止这些,下面只是通过举例说明着重讲讲这常用的五种方法。一、正交实验法用语言描述正交实验法会很抽象难懂,简单说,就是在各因素互相独立…

    2022年6月29日
    22
  • 用AVX2指令集优化浮点数组求和

    用AVX2指令集优化浮点数组求和用AVX2指令集优化浮点数组求和一、AVX2指令集介绍二、代码实现0.数据生成1.普通数组求和2.AVX2指令集求和:单精度浮点(float)3.AVX2指令集求和:双精度浮点(double)三、性能测试测试环境计时方式测试内容进行性能测试第一次测试第二次测试四、总结个人猜测原因:一、AVX2指令集介绍AVX2是SIMD(单指令多数据流)指令集,支持在一个指令周期内同时对256位内存进行操作。包含乘法,加法,位运算等功能。下附Intel官网使用文档。Intel®IntrinsicsGuid

    2022年5月7日
    48
  • xshell ping不通虚拟机_虚拟机为什么ping不通主机

    xshell ping不通虚拟机_虚拟机为什么ping不通主机有朋友联系说:“虚拟机可以ping本机,本机也可以ping虚拟机,但是Xshell连接不上虚拟机。”,找了不少资料发现好像不是这个问题的解决方法,所以在这里介绍下怎么解决这个问题。同时,总结几种xshell连接不上虚拟机的解决方法。

    2022年9月22日
    2
  • SSM框架介绍「建议收藏」

    SSM框架介绍「建议收藏」1、SSM框架简介SSM框架是SpringMVC,Spring和Mybatis框架的整合,是标准的MVC模式,将整个系统划分为表现层,Controller层,Service层,DAO层四层,使用SpringMVC负责请求的转发和视图管理,Spring实现业务对象管理,Mybatis作为数据对象的持久化引擎。…

    2022年7月12日
    22
  • php的Allowed memory size of 134217728 bytes exhausted问题解决办法

    php的Allowed memory size of 134217728 bytes exhausted问题解决办法php的Allowed memory size of 134217728 bytes exhausted问题解决办法

    2022年4月24日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号