题解
设 \(len_i\) 为第 \(i\) 次操作后的数组长度, \(last_i\) 为该数组的最后一个数字
那么对于第一个 \(len\) 大于 \(k\) 的 \(i\) 而言 \({A}_{i}[k] \to A_{i-1}[k_1]\)
其中 \(k_1=(k-1)\% len_{i-1}+1\)
如果 \(k\) 等于此时的 \(len_i\) 那么输出 \(last_i\)
小细节: \(len<=1e18\)
code
#define ll long long
#include<bits/stdc++.h>
using namespace std;
inline void read(ll &x) {
x = 0;
ll flag = 1;
char c = getchar();
while(c < '0' || c > '9'){
if(c == '-')flag = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
x = (x << 3) + (x << 1) + (c ^ 48);
c = getchar();
}
x *= flag;
}
inline void write(ll x)
{
if(x < 0){
putchar('-');
x = -x;
}
if(x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
ll len[100005]={0},last[100005]={0};
int main()
{
ll t;
read(t);
while(t--)
{
ll n,q;
read(n); read(q);
for(ll i=1;i<=n;i++)
{
ll c,x;
cin>>c>>x;
if(c==1)
{
len[i]=min((ll)2e18,len[i-1]+1);
last[i]=x;
}
else
{
len[i]=2e18;
if(len[i]/(x+1)<len[i-1])continue;
len[i]=len[i-1]*(x+1);
last[i]=last[i-1];
}
}
while(q--)
{
ll k;
read(k);
ll i=lower_bound(len+1,len+1+n,k)-len;
while(k!=len[i])
{
k=(k-1)%len[i-1]+1;
i=lower_bound(len+1,len+1+n,k)-len;
}
cout<<last[i]<<" ";
}
puts("");
}
return 0;
}
标签:last,read,ll,len,while,Array,Repetition,getchar
From: https://www.cnblogs.com/pure4knowledge/p/18073624