此题代码,C++17会编译错误,但是C++14编译就可以通过,并且过题,这是为什么?
#include<bits/stdc++.h>
using namespace std;
const int MAXN=4e5+7;
bitset<61> tree[MAXN<<3];
vector<int> g[MAXN];
int size[MAXN],dep[MAXN],mp[MAXN],f[MAXN],c[MAXN],tot,lazytag[MAXN<<3];
void pushdown(int p)
{
tree[p*2].reset();
tree[p*2+1].reset();
tree[p*2].set(lazytag[p]);
tree[p*2+1].set(lazytag[p]);
lazytag[p*2]=lazytag[p];
lazytag[p*2+1]=lazytag[p];
lazytag[p]=0;
return ;
}
bitset<61> query(int p,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
return tree[p];
int mid=(l+r)>>1;
if(lazytag[p])
pushdown(p);
bitset<61> ans;
ans.reset();
if(x<=mid)
ans|=query(p*2,l,mid,x,y);
if(mid<y)
ans|=query(p*2+1,mid+1,r,x,y);
return ans;
}
void change(int p,int l,int r,int x,int y,int v)
{
if(x<=l&&r<=y)
{
tree[p].reset();
tree[p].set(v);
lazytag[p]=v;
return ;
}
int mid=(l+r)>>1;
if(lazytag[p])
pushdown(p);
if(x<=mid)
change(p*2,l,mid,x,y,v);
if(mid<y)
change(p*2+1,mid+1,r,x,y,v);
tree[p]=tree[p*2]|tree[p*2+1];
return ;
}
void build(int p,int l,int r)
{
if(l==r)
{
tree[p].set(c[f[l]]);
return ;
}
int mid=(l+r)>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
tree[p]=tree[p*2]|tree[p*2+1];
return ;
}
void dfn(int x)
{
mp[x]=++tot;
f[tot]=x;
for(int i(0);i<g[x].size();++i)
if(!mp[g[x][i]])
dfn(g[x][i]);
return ;
}
void dfs(int x,int from)
{
size[x]++;
for(int i(0);i<g[x].size();++i)
{
if(g[x][i]==from)
continue;
dfs(g[x][i],x);
size[x]+=size[g[x][i]];
}
return ;
}
int main()
{
int n,q;
scanf("%d%d",&n,&q);
for(int i(1);i<=n;++i)
{
int x;
scanf("%d",&x);
c[i]=x;
}
for(int i(1);i<n;++i)
{
int u,v;
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,1);
dfn(1);
build(1,1,tot);
while(q--)
{
int opt,u,c;
scanf("%d",&opt);
if(opt==1)
{
scanf("%d%d",&u,&c);
change(1,1,tot,mp[u],mp[u]+size[u]-1,c);
}
else
{
scanf("%d",&u);
printf("%d\n",query(1,1,tot,mp[u],mp[u]+size[u]-1).count());
}
// for(int i(1);i<=tot;++i)
// {
// bitset<61> s;
// s=query(1,1,tot,mp[i],mp[i]);
// for(int j(1);j<=60;++j)
// if(s[j])
// {
// printf("%d ",j);
// break;
// }
// }
// printf("\n");
}
return 0;
}