Untitled

mail@pastecode.io avatar
unknown
plain_text
14 days ago
2.2 kB
1
Indexable
Never
#include <bits/stdc++.h>

using namespace std;

const int N=2e5+7;
const int INF=1e9;

int n;

int a[N];

int t[N*4];
int tmn[N*4];
int t2[N*4];
int t2mn[N*4];

void upd(int ind, int val,int u=1,int ul=1,int ur=n){
	if(ul==ur){
		t[u]+=val;
		tmn[u]+=val;
		return;
	}
	int um=(ul+ur)/2;
	if(ind<=um)upd(ind,val,u*2,ul,um);
	else upd(ind,val,u*2+1,um+1,ur);
	t[u]=max(t[u*2],t[u*2+1]);
	tmn[u]=min(tmn[u*2],tmn[u*2+1]);
}

int getmx(int l,int r,int u=1,int ul=1,int ur=n){
	if(r<ul || ur<l)return 0;
	if(l<=ul&&ur<=r)return t[u];
	int um=(ul+ur)/2;
	return max(getmx(l,r,u*2,ul,um),getmx(l,r,u*2+1,um+1,ur));
}

int getmn(int l,int r,int u=1,int ul=1, int ur=n){
	if(r<ul || ur<l)return INF;
	if(l<=ul&&ur<=r)return tmn[u];
	int um=(ul+ur)/2;
	return min(getmn(l,r,u*2,ul,um),getmn(l,r,u*2+1,um+1,ur));
}

void upd2(int ind, int val,int u=1,int ul=1,int ur=n){
	if(ul==ur){
		t2[u]+=val;
		t2mn[u]+=val;
		return;
	}
	int um=(ul+ur)/2;
	if(ind<=um)upd2(ind,val,u*2,ul,um);
	else upd2(ind,val,u*2+1,um+1,ur);
	t2[u]=max(t2[u*2],t2[u*2+1]);
	t2mn[u]=min(t2mn[u*2],t2mn[u*2+1]);
}

int getmx2(int l,int r,int u=1,int ul=1,int ur=n){
	if(r<ul || ur<l)return 0;
	if(l<=ul&&ur<=r)return t2[u];
	int um=(ul+ur)/2;
	return max(getmx2(l,r,u*2,ul,um),getmx2(l,r,u*2+1,um+1,ur));
}

int getmn2(int l,int r,int u=1,int ul=1, int ur=n){
	if(r<ul || ur<l)return INF;
	if(l<=ul&&ur<=r)return t2mn[u];
	int um=(ul+ur)/2;
	return min(getmn2(l,r,u*2,ul,um),getmn2(l,r,u*2+1,um+1,ur));
}

signed main(){
	int tt;
	cin>>tt;
	while(tt--){
		cin>>n;
		for(int i=1;i<=n;i++)cin>>a[i];
		upd(a[1],1);
		for(int i=2;i<=n;i++){
			upd2(a[i],1);
		}
		int l1=1;
		int l2=n-1;
		vector<pair<int,int>>ans;
		if(getmx(1,l1)==getmn(1,l1) && getmx2(1,l2)==getmn2(1,l2) && getmx(1,l1)==1 && getmx2(1,l2)==1)ans.push_back({l1,l2});
		for(int i=2;i<n;i++){
			l1++;
			l2--;
			upd(a[i],1);
			upd2(a[i],-1);
			if(getmx(1,l1)==getmn(1,l1) && getmx2(1,l2)==getmn2(1,l2) && getmx(1,l1)==1 && getmx2(1,l2)==1)ans.push_back({l1,l2});
		}
		cout<<ans.size()<<'\n';
		for(auto to:ans)cout<<to.first<<" "<<to.second<<'\n';
		for(int i=1;i<=n*4;i++){
			t[i]=0;
			t2[i]=0;
		}
	}
}
Leave a Comment