思路:可以将m个步骤所到的最后位置记录下来,在查询位置t所在的数字时,可以利用二分来查找到t所在的构造步骤k里,若k的类型为1则可以直接输出k.x,否则就将t缩小到前k.li位置中,在重复查找一直到步骤k的类型为1.
Code :
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
struct node{
int ti;
int li;
int ci;
};
const int MAX_N=100005;
int n,m;
node a[MAX_N];
LL d[MAX_N];
int main()
{
ios::sync_with_stdio(false);
cin>>n;
int ti,li,ci=0;
for(int i=0;i<n;++i)
{
cin>>ti>>li;
if(ti==2){
cin>>ci;
d[i]=d[i-1]+li*ci;
}else d[i]=d[i-1]+1;
a[i]=node{ti,li,ci};
}
cin>>m;
LL t;
for(int i=0;i<m;++i)
{
cin>>t;
int k=lower_bound(d,d+n,t)-d;
if(a[k].ti==2){
while(a[k].ti==2){
t=a[k].li-(d[k]-t)%a[k].li;
if(!t) t=a[k].li;
k=lower_bound(d,d+k,t)-d;
}
}
if(i) cout<<" ";
cout<<a[k].li;
}
cout<<endl;
return 0;
}