Language: C++

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define INF (1<<29)



template<class T>
struct Vector{
	int sz,cap;
	T *p;
	Vector():sz(0),cap(0),p(0){}
	~Vector(){
		clear();
	}
	void swap(Vector &v){
		std::swap(sz,v.sz);
		std::swap(cap,v.cap);
		std::swap(p,v.p);
	}
	int size()const{return sz;}
	bool empty()const{return !sz;}
	T& back()const{
		return p[sz-1];
	}
	void push_back(T v){
		if(sz==cap)reserve(sz?sz*2:1);
		new(p+sz++) T(v);
	}
	void pop_back(){
		p[--sz].~T();
		if(sz&&sz*4<cap){
			reserve(cap/2);
		}
	}
	void resize(int n){
		clear();
		if(n==0)return;
		cap=1;
		while(cap<n)cap*=2;
		reserve(cap);
		for(int i=0;i<n;i++)new(p+i) T();
		sz=n;
	}
	void reserve(int n){
		T *p=(T*)operator new(n*sizeof(T));
		for(int i=0;i<sz;i++){
			new(p+i) T(this->p[i]);
			p[i].~T();
		}
		if(this->p)operator delete(this->p);
		this->p=p;
		cap=n;
	}
	void clear(){
		for(int i=0;i<sz;i++){
			p[i].~T();
		}
		if(p)operator delete(p);
		sz=cap=0;
		p=0;
	}
	T& operator[](int i)const{
		return p[i];
	}
};


template<class T>
class BinomialHeap{
	struct Tree{
		T val;
		Vector<Tree *> edge;
		Tree(T &v):val(v){}
		~Tree(){
			for(int i=0;i<degree();i++)delete edge[i];
		}	
		void add(Tree *t){edge.push_back(t);}
		void pop(Tree *t){edge.pop_back();}
		int degree()const{return edge.size();}
	};
	Vector<Tree*> trees;
	mutable int imax;

	static Tree* add(Tree* a,Tree* b){
		if(a->val > b->val){
			a->add(b);
			return a;
		}else{
			b->add(a);
			return b;
		}
	}
	void findmax()const{
		for(int i=0;i<trees.size();i++)
			if(trees[i] && (imax==-1||trees[i]->val > trees[imax]->val))
				imax=i;
	}
public:
	BinomialHeap():imax(-1){}
	~BinomialHeap(){
		clear();
	}
	//O(log n)
	void meld(BinomialHeap &h){
		imax=-1;
		Tree* carry=NULL;
		if(trees.size()<h.trees.size())trees.swap(h.trees);
		for(int i=0;i<trees.size();i++){
			if(carry){
				if(i<h.trees.size() && h.trees[i]){
					carry=add(carry,h.trees[i]);
					h.trees[i]=NULL;
				}else if(trees[i]){
					carry=add(carry,trees[i]);
					trees[i]=NULL;
				}else{
					trees[i]=carry;
					carry=NULL;
				}
			}else if(i<h.trees.size() && h.trees[i]){
				if(trees[i]){
					carry=add(trees[i],h.trees[i]);
					trees[i]=h.trees[i]=NULL;	
				}else{
					trees[i]=h.trees[i];
					h.trees[i]=NULL;		
				}
			}
		}
		if(carry)trees.push_back(carry);
		h.clear();
	}
	//O(log n)
	void push(T &v){
		imax=-1;
		BinomialHeap h;
		h.trees.push_back(new Tree(v));
		meld(h);
	}
	T getmax()const{
		if(imax==-1)findmax();
		return trees[imax]->val;
	}
	void popmax(){
		if(imax==-1)findmax();
		BinomialHeap h;
		trees[imax]->edge.swap(h.trees);
		delete trees[imax];
		trees[imax]=NULL;
		meld(h);
		while(!trees.empty() && trees.back()==NULL)trees.pop_back();
		imax=-1;
	}
	bool empty()const{
		return trees.empty();
	}
	void clear(){
		imax=-1;
		for(int i=0;i<trees.size();i++)
			if(trees[i])
				delete trees[i];
		trees.clear();
	}
	//void remove(int id){}
	//decrease_key remove(int id,T v){}
};


int n,q;
vector<int> edge[100000];
int marked[100000];
BinomialHeap<int> bh[100000];
int ans;


void dfs(int u){
	for(int i=0;i<edge[u].size();i++){
		dfs(edge[u][i]);
		bh[u].meld(bh[edge[u][i]]);
	}
	int t=marked[u];
	while(!bh[u].empty() && t<bh[u].getmax()){
		ans+=u+1;
		bh[u].popmax();
	}
}

int main(){
	while(cin>>n>>q&&n){
		for(int i=0;i<n;i++)edge[i].clear();
		for(int i=0;i<n;i++)bh[i].clear();
		for(int i=0;i<n;i++)marked[i]=INF;
		marked[0]=0;
		for(int i=1;i<n;i++){
			int p;
			cin>>p;
			edge[p-1].push_back(i);
		}
		for(int i=0;i<q;i++){
			char op;
			int v;
			cin>>op>>v;
			v--;
			if(op=='M'){
				marked[v]=min(marked[v],i+1);
			}else{
				bh[v].push(i+1);
			}
		}
		ans=0;
		dfs(0);
		cout<<ans<<endl;
	}
	return 0;
}

Compiler output:
a.cc: In function 'int main()':
a.cc:209:45: error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'
  209 |                                 bh[v].push(i+1);
      |                                            ~^~
a.cc:136:22: note:   initializing argument 1 of 'void BinomialHeap<T>::push(T&) [with T = int]'
  136 |         void push(T &v){
      |                   ~~~^