思路和题解一差不多
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAX=5e5+10;
inline int read()
{
char qwqc=getchar();
int qwqf=1,qwqx=0;
while(qwqc<'0'||qwqc>'9')
{
if(qwqc=='-') qwqf=-1;
qwqc=getchar();
}
while(qwqc>='0'&&qwqc<='9')
{
qwqx=(qwqx<<3)+(qwqx<<1)+(qwqc^48);
qwqc=getchar();
}
return qwqf*qwqx;
}
int ans;
struct node{int f,l,r,w,ans,topp;}a[MAX];//w存权值,"("为1,")"为0
void ask(int k,int num)
{
if(a[k].w)
{
a[k].ans=a[a[k].f].ans;
a[k].topp=a[a[k].f].topp+1;
}
if(!a[k].w)
{
a[k].topp=a[a[k].f].topp;
if(a[k].topp)
{
if(a[a[k].f].w)
{
a[k].topp--;
num++;
a[k].ans=a[a[k].f].ans+num;
}
if(!a[a[k].f].w)
{
a[k].topp--;
num=1;
a[k].ans=a[a[k].f].ans+1;
}
}
else
{
num=0;
a[k].ans=a[a[k].f].ans;
}
}
cout<<a[k].ans<<endl;
//ans^=(k*a[k].ans);
if(a[k].l) ask(a[k].l,num);
if(a[k].r) ask(a[k].r,num);
}
signed main()
{
int n=read();
for(int i=1;i<=n;i++)
{
char c=getchar();
if(c=='(') a[i].w=1;
if(c==')') a[i].w=0;
}
for(int i=2;i<=n;i++)
{
int x;
cin>>x;
a[i].f=x;
if(!a[x].l) a[x].l=i;
else a[x].r=i;
}
ask(1,0);
//cout<<ans<<endl;
return 0;
}