https://atcoder.jp/contests/abc411/tasks/abc411_d
为什么n*log(n)不能过?
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,q,l[4],op[N],p[N],cnt;
string ss[N],anss;
vector<int> a3,a[N];
void f3(int s,int t),f12(int s,int t,int id);
void f12(int s,int t,int id){
if(s>t){
return ;
}
int l=0,r=a[id].size()-1,ans=-1;
while(l<=r){
int mid=(l+r)/2;
if(a[id][mid]>=s&&a[id][mid]<=t){
ans=mid;
l=mid+1;
}
else{
r=mid-1;
}
}
if(ans==-1){
return ;
}
int i=a[id][ans];
if(op[i]==1){
f3(1,i);
}
else if(op[i]==2){
anss=ss[i]+anss;
f12(1,i-1,id);
}
}
void f3(int s,int t){
int l=0,r=a3.size()-1,ans=-1;
while(l<=r){
int mid=(l+r)/2;
if(a3[mid]>=s&&a3[mid]<=t){
ans=mid;
l=mid+1;
}
else{
r=mid-1;
}
}
if(ans==-1){
return ;
}
else{
int i=a3[ans];
f12(1,i-1,p[i]);
}
}
int main(){
cin>>n>>q;
for(int i=1;i<=q;i++){
cin>>op[i]>>p[i];
if(op[i]==1){
a[p[i]].push_back(i);
}
else if(op[i]==2){
cin>>ss[i];
a[p[i]].push_back(i);
}
else{
a3.push_back(i);
}
}
f3(1,q);
cout<<anss;
return 0;
}