注意判掉死循环即可
const int N = 1e5 + 10;
int n,m;
struct Node
{
int q,v;
bool error;//1被击破,0未被击破
}a[N];
void solve()
{
cin >> n >> m;
for (int i = 1;i <= n; i++)
{
int q,v; cin >> q >> v;
a[i] = {q,v};
}
LL cnt = 0;
LL len = 1;//步长
int fx = 1;//右为1,左为-1
if (a[m].q == 1 && len >= a[m].v) cnt ++,a[m].error = true;//被击毁
if (a[m].q == 0) len += a[m].v,fx = -fx;
m = m + fx*len;
LL sum = 0;
while(m >= 1 && m <= n)
{
if (sum >= 1e6) break;//防止死循环
sum ++;
if (a[m].q == 1)
{
if (len >= a[m].v && !a[m].error) cnt++,a[m].error = true;
m = m + fx*len;
}
else
{
len += a[m].v,fx = -fx;
m = m + fx*len;
}
}
cout << cnt << endl;
}