悬一关,感觉像主函数有问题
#include<bits/stdc++.h>
using namespace std;
#define int long long
int read()
{
int f=1,x=0;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
return f*x;
}
const int N = 1e5 + 505;
const int mod = 1e6 + 3;
int lft[N],rgt[N],siz[N],p[N],head,cnt,n,m,q;
string key[N];
void up(int i)
{
siz[i] = siz[lft[i]] + siz[rgt[i]] + 1;
}
void split(int l,int r,int i,int s)
{
if(i == 0)
lft[r] = rgt[l] = 0;
else
{
if(siz[lft[i]] + 1 <= s)
{
rgt[l] = i;
split(i,r,rgt[i],s - lft[i] - 1);
}
else
{
lft[r] = i;
split(l,i,lft[i],s);
}
up(i);
}
}
int merge(int l,int r)
{
if(l == 0 || r == 0)
return l + r;
if(p[l] >= p[r])
{
rgt[l] = merge(rgt[l],r);
up(l);
return l;
}
else
{
lft[r] = merge(l,lft[r]);
up(r);
return r;
}
}
signed main()
{
srand(time(0));
cin>>n;
while(n--)
{
cin>>key[++cnt];
siz[cnt] = 1;
p[cnt] = rand() * rand() % mod;
head = merge(head,cnt);
}
cin>>m;
while(m--)
{
cin>>key[++cnt];
siz[cnt] = 1;
p[cnt] = rand() * rand() % mod;
int x = read() + 1;
split(0,0,head,x);
int l = rgt[0],r = lft[0];
head = merge(merge(l,cnt),r);
}
cin>>q;
while(q--)
{
int x = read() + 1;
split(0,0,head,x);
int lm = rgt[0],r = lft[0];
split(0,0,lm,x-1);
int l = rgt[0],id = lft[0];
for(char c : key[id])
putchar(c);
putchar('\n');
head = merge(merge(l,id),r);
}
return 0;
}