#pragma once
template<typenameT>structPersistentQueue{structNode{intd;Tval;vector<Node*>par;Node(intd_):d(d_){}Node(intd_,constT&val_,Node*n):d(d_),val(val_),par({n}){}};usingP=pair<Node*,Node*>;vector<P>roots;PersistentQueue(){Node*root=newNode(0);roots.emplace_back(root,root);}intpush(constT&val,intid=-1){Node*s,*e;tie(s,e)=id==-1?roots.back():roots[id];Node*ne=newNode(e->d+1,val,e);roots.emplace_back(s,ne);for(inti=0;;i++){if((int)e->par.size()<=i)break;Node*nxt=e->par[i];ne->par.push_back(e=nxt);}return(int)roots.size()-1;}pair<T,int>pop(intid=-1){Node*s,*e;tie(s,e)=id==-1?roots.back():roots[id];Node*ns=e;for(intx=e->d-s->d-1;x;){intd=__builtin_ctz(x);ns=ns->par[d];x-=1<<d;}roots.emplace_back(ns,e);returnmake_pair(ns->val,(int)roots.size()-1);}};