이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
const int maxn=300000+10;
struct yal{
int u,v,w;
int getad(int fu){
int ret=(fu^u^v);
return ret;
}
};
struct quer{
char c;
int u,v,w,res;
quer(){
res=0;
}
};
quer allq[maxn];
yal alled[maxn];
vector<int>adj[maxn];
int high[maxn],n,k,now=0,nowq=0,timea=0,dpinc[maxn],dpdec[maxn],val[maxn];
pair<int,int>stf[maxn];
int kaf=(1<<17);
struct segpaeen{
set<pair<int,int>>seg[(1<<18)];
void upd(int i,int l,int r,int tl,int tr,pair<int,int> w){
if(l>r||l>tr||r<tl||tl>tr){
return ;
}
if(l>=tl&&r<=tr){
if(w.first>0){
seg[i].insert(w);
return ;
}
else{
w.first=-w.first;
seg[i].erase(w);
return ;
}
}
int m=(l+r)>>1;
upd((i<<1),l,m,tl,tr,w);
upd((i<<1)^1,m+1,r,tl,tr,w);
}
pair<int,int> pors(int i){
if(i==0){
return make_pair(0,0);
}
pair<int,int> ret=pors((i>>1));
if((int)seg[i].size()==0){
return ret;
}
ret=max(ret,(*seg[i].rbegin()));
return ret;
}
}seg1;
struct segpo{
struct node{
vector<int>v;
vector<int>fen;
int sz;
void create(){
fen.resize((int)v.size()+3);
sz=fen.size();
}
void upd(int i){
while(i<sz){
fen[i]++;
i+=(-i)&i;
}
}
int pors(int i){
int ret=0;
while(i>0){
ret+=fen[i];
i-=(-i)&i;
}
return ret;
}
};
node seg[(1<<18)];
void aval(int i,int w){
if(i==0){
return ;
}
seg[i].v.push_back(w);
return aval((i>>1),w);
}
void pre(){
for(int i=1;i<(1<<18);i++){
seg[i].v.push_back(-1);
sort(seg[i].v.begin(),seg[i].v.end());
seg[i].v.resize(unique(seg[i].v.begin(),seg[i].v.end())-seg[i].v.begin());
seg[i].create();
}
}
void upd(int i,int w){
if(i==0){
return ;
}
int p=lower_bound(seg[i].v.begin(),seg[i].v.end(),w)-seg[i].v.begin();
seg[i].upd(p);
upd((i>>1),w);
}
int pors(int i,int l,int r,int tl,int tr,int w){
if(l>r||l>tr||r<tl||tl>tr)
{
return 0;
}
if(l>=tl&&r<=tr){
int p=upper_bound(seg[i].v.begin(),seg[i].v.end(),w)-seg[i].v.begin();
int ret=seg[i].pors(p-1);
return ret;
}
int m=(l+r)>>1;
int ret=pors((i<<1),l,m,tl,tr,w)+pors((i<<1)^1,m+1,r,tl,tr,w);
return ret;
}
}seg2;
void dfs(int u,int para=0){
if(u!=1){
if(val[u]<val[para]){
dpinc[u]=dpinc[para];
dpdec[u]=para;
}
else{
dpinc[u]=para;
dpdec[u]=dpdec[para];
}
}
else{
dpinc[u]=u;
dpdec[u]=u;
high[u]=1;
}
timea++;
stf[u].first=timea;
for(auto x:adj[u]){
int v=alled[x].getad(u);
if(v!=para){
val[v]=alled[x].w;
high[v]=high[u]+1;
dfs(v,u);
}
}
stf[u].second=timea;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>k;
for(int i=0;i<n+k-1;i++){
char c;
cin>>c;
if(c=='S'){
now++;
cin>>alled[now].u>>alled[now].v;
alled[now].w=now;
nowq++;
allq[nowq].c=c;
allq[nowq].u=alled[now].u;
allq[nowq].v=alled[now].v;
allq[nowq].w=alled[now].w;
adj[alled[now].u].push_back(now);
adj[alled[now].v].push_back(now);
continue;
}
if(c=='Q'){
nowq++;
allq[nowq].c=c;
cin>>allq[nowq].u>>allq[nowq].v;
allq[nowq].w=now;
continue;
}
nowq++;
allq[nowq].c=c;
cin>>allq[nowq].u;
allq[nowq].w=now;
}
dfs(1);
for(int i=1;i<=n;i++){
seg1.upd(1,0,kaf-1,stf[i].first,stf[i].second,make_pair(high[i],i));
seg2.aval(stf[i].first+kaf,stf[dpdec[i]].first);
}
seg2.pre();
for(int i=1;i<=nowq;i++){
if(allq[i].c=='S'){
int u=allq[i].u,v=allq[i].v;
if(stf[v].first<stf[u].first){
swap(u,v);
}
seg2.upd(stf[v].first+kaf,stf[dpdec[v]].first);
seg1.upd(1,0,kaf-1,stf[v].first,stf[v].second,make_pair(-high[v],v));
continue;
}
if(allq[i].c=='Q'){
int u=allq[i].u,v=allq[i].v;
swap(u,v);
pair<int,int> lowa=seg1.pors(kaf+stf[u].first);
//cout<<u<<" "<<lowa<<" 1\n";
if(lowa.first==0||lowa.first<high[dpinc[u]]){
lowa.second=dpinc[u];
}
if((stf[v].first<=stf[u].first&&stf[v].second>=stf[u].second&&stf[v].first>=stf[lowa.second].first)){
cout<<"yes\n";
continue;
}
if(!(stf[v].first>=stf[u].first&&stf[v].second<=stf[lowa.second].second)){
cout<<"no\n";
continue;
}
int cnt=seg2.pors(1,0,kaf-1,stf[v].first,stf[v].first,stf[u].first);
if(cnt==1||u==v){
cout<<"yes\n";
}
else{
cout<<"no\n";
}
continue;
}
int u=allq[i].u;
pair<int,int> lowa=seg1.pors(kaf+stf[u].first);
// cout<<u<<" "<<lowa.second<<" 1\n";
if(lowa.first==0||lowa.first<high[dpinc[u]]){
lowa.second=dpinc[u];
}
//cout<<u<<" "<<lowa.second<<" 2\n";
int cnt=seg2.pors(1,0,kaf-1,stf[u].first+1,stf[lowa.second].second,stf[u].first);
//if(seg2.pors(1,0,kaf-1,stf[u].first,stf[u].first,stf[u].first)==0){
cnt+=high[u]-high[lowa.second]+1;
//}
cout<<cnt<<"\n";
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |