记录所有操作以及操作结束后的数列长度。对于每个询问,二分查找对应的操作。如果查找到的操作种类为2,则继续向前二分查找,直到查找到的操作种类为1为止。
时间复杂度O(N*log(N)*log(N))
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100100;
long long op[MAXN],pos[MAXN],l[MAXN],c[MAXN],x[MAXN];
int main()
{
long long m,n,q,index,i;
while(scanf("%lld",&m)!=EOF)
{
pos[0]=0;
for(i=1;i<=m;i++)
{
scanf("%lld",&op[i]);
if(op[i]==1)
{
scanf("%lld",&x[i]);
pos[i]=pos[i-1]+1;
}
else
{
scanf("%lld%lld",&l[i],&c[i]);
pos[i]=pos[i-1]+l[i]*c[i];
}
}
scanf("%lld",&n);
while(n--)
{
scanf("%lld",&q);
index=lower_bound(pos,pos+m+1,q)-pos;
while(op[index]!=1)
{
q=(q-pos[index-1])%l[index];
if(q==0)
q=l[index];
index=lower_bound(pos,pos+m+1,q)-pos;
}
printf("%lld ",x[index]);
}
printf("\n");
}
}