思路是第一篇题解的
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+1;
struct snake{
int id,val;
snake(){}
snake(int a,int b){
id=a,val=b;
}
bool operator<(const snake &rhs)const{
return val<rhs.val||(val==rhs.val&&id<rhs.id);
}
snake operator-(const snake &rhs)const{
snake ans=*this;
ans.val-=rhs.val;
return ans;
}
};
deque<snake>q1,q2;
int t,n,a[N];
snake gmin(){
if(q2.empty()||(q1.front()<q2.front()))return q1.front();
return q2.front();
}
snake gmax(){
if(q2.empty()||(q2.back()<q1.back()))return q1.back();
return q2.back();
}
void pmin(){
if(q2.empty()||(q1.front()<q2.front()))q1.pop_front();
else q2.pop_front();
}
void pmax(){
if(q2.empty()||(q2.back()<q1.back()))q1.pop_back();
else q2.pop_back();
}
void solve(){
while(q1.size())q1.pop_back();
while(q2.size())q2.pop_back();
for(int i=1;i<=n;i++)q1.push_back(snake(i,a[i]));
while(1){
if(q1.size()+q2.size()==2){
cout<<1<<'\n';
return;
}
snake mx=gmax(),mn=gmin();pmax(),pmin();
snake f=mx-mn;
if(q1.empty()||f<q1.front()){
int ans=q1.size()+q2.size()+2,cnt=0;
while(1){
cnt++;
if(q1.size()+q2.size()==1){
break;
}
mx=gmax(),pmax();
f=mx-f;
if(gmin()<f){
break;
}
}
ans-=1-cnt%2;
cout<<ans<<'\n';
return;
}else{
q2.push_front(f);
}
}
}
signed main(){
// freopen("tmp.in","r",stdin);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>t>>n;
for(int i=1;i<=n;i++)cin>>a[i];
solve();
t--;
while(t--){
int k;
cin>>k;
for(int i=1,x,y;i<=n;i++){
cin>>x>>y;
a[x]=y;
}
solve();
}
}