틀림~
1. power가 짧다고 아랫것도 push안함 (testcase없으면 어떻게 알아낼건데)
2. OFF한 본인은 아랫것들 알림 받을수가 있었음;;
3. 아예 수신가능 알림 수를 계속 업데이트 해서 사용. 500 호출 시 for문돌리면 시간초과남
근데 dp 로직 자체가 답을 봐도 이해가 안돼서 오답 포기.. 강해져서 돌아오자
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int N;
int val[21];
int info[100001][21];
struct node {
int data;
int parent;
int authority;
int alarm;
};
vector <node> Chat;
void update (int start){
for(int i=start;i<=N;i++){
int curr=i;
int x=Chat[curr].authority;
while(Chat[curr].parent!=0&&x!=0){
curr=Chat[curr].parent;
x--;
if(x>0) val[curr]++;
nx[curr][x]++;
}
}
}
void alarmOn(int c){
if(Chat[c].alarm==1)Chat[c].alarm=0;
else Chat[c].alarm=1;
}
void powerChange(int c, int power){
Chat[c].authority=power;
}
void changeParents(int c1, int c2){
int tmp=Chat[c1].parent;
Chat[c1].parent=Chat[c2].parent;
Chat[c2].parent=tmp;
}
void checkAlarm(int c){
int cnt=0;
queue <pair<int,int>> check;
check.push(make_pair(c,1));
while(!check.empty()){
int front_data=check.front().first;
int front_length=check.front().second;
check.pop();
for(node n:Chat){
if(n.parent==front_data&&n.alarm==1){
if(n.authority>=front_length){
cnt++;
}
check.push(make_pair(n.data,front_length+1));
}
}
}
cout<<cnt<<endl;
}
int main() {
int order,Q,value1, value2;
cin>>N>>Q;
Chat.resize(1+N);
// 100 준비
cin>>order;
for(int i=1;i<=N;i++){
cin>>Chat[i].parent;
Chat[i].data=i;
Chat[i].alarm=1;
}
for(int i=1;i<=N;i++){
cin>>Chat[i].authority;
}
// 명령 입력
int num=1;
while(num++<Q){
cin>>order;
if(order==200){
cin>>value1;
alarmOn(value1);
}
else if (order == 300){
cin>>value1>>value2;
powerChange(value1,value2);
}
else if (order == 400){
cin>>value1>>value2;
changeParents(value1,value2);
}
else if (order == 500){
cin>>value1;
checkAlarm(value1);
}
}
return 0;
}