Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 3

#include <bits/stdc++.

h>
using namespace std;
#define int long long
#define mod 1000000007
#define Time cerr << "time taken : " << (float)clock() / CLOCKS_PER_SEC << " secs"
<< endl;
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define vi vector<int>
#define onesbits(x) __builtin_popcountll(x)
#define zerobits(x) __builtin_ctzll(x)
#define sp(x, y) fixed << setprecision(y) << x
#define w(x) int x;cin >> x;while (x--)
#define tk(x) int x;cin >> x;
#define fast ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
#ifndef ONLINE_JUDGE
#define debug(x) cerr<< #x <<" ";_print(x);cerr<<endl;
#else
#define debug(x)
#endif
template <class T> void _print(T t){cerr<<t;}
template <class T, class V> void _print(pair <T, V> p) {cerr << "{"; _print(p.ff);
cerr << ","; _print(p.ss); cerr << "}";}
template <class T> void _print(vector <T> v) {cerr << "[ "; for (T i : v)
{_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(vector < vector <T> > v){cerr<<"[\n";for(int
l=0;l<v.size();l++){{for(int k=0;k<v[l].size();k++)cerr<<v[l][k]<<" ";}cerr<<"\
n";}cerr<<"]";}
template <class T, class V> void _print(map <T, V> v) {cerr << "[ "; for (auto i :
v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(set <T> v) {cerr << "[ "; for (T i : v) {_print(i);
cerr << " ";} cerr << "]";}
class gcd{public:int g,t;};
int modularInverse(int a,int m){int z=(a%m+m)%m; return z; }
gcd extended_euclidean(int a,int b,int t1,int t2){ if(b==0){ gcd x; x.g=a; x.t=t1;
return x; }int t=t1-t2*(int)(a/b);return extended_euclidean(b,a%b,t2,t);}
int merge(int a,int b){return a+b;}

struct Node{
int pre,suf,sum,ans;

};
Node NodeMerge(Node A,Node B);

void segmentree(vector<Node>&ans,int x,int l,int r,vector<int>&v){


if(l==r){
if(v[l]<0) {
ans[x].pre=ans[x].suf=ans[x].ans=0;
ans[x].sum=v[l];
}
else ans[x].pre=ans[x].suf=ans[x].ans=ans[x].sum=v[l];
return ;
}
int mid=l+(r-l)/2;
segmentree(ans,2*x,l,mid,v);
segmentree(ans,2*x+1,mid+1,r,v);
ans[x]=NodeMerge(ans[2*x],ans[2*x+1]);}
Node query(int x,int l,int r,int tl,int tr)
{
if(tl<=l && r<=tr)return seg[x];
if(r<tl || l>tr)return 0;
int mid=l+(r-l)/2;
return NodeMerge(query(2*x,l,mid,tl,tr),query(2*x+1,mid+1,r,tl,tr));
}

void update(int x,int l,int r,int pos,int val,vector<Node>&ans)


{
if(l==pos && r==pos) {
if(val<0) {
ans[x].pre=ans[x].suf=ans[x].ans=0;
ans[x].sum=val;
}
else ans[x].pre=ans[x].suf=ans[x].ans=ans[x].sum=val;
return;
}
if(pos<l || r<pos)return;
int mid=l+(r-l)/2;
update(2*x,l,mid,pos,val,ans);
update(2*x+1,mid+1,r,pos,val,ans);
ans[x]=NodeMerge(ans[2*x],ans[2*x+1]);
}

Node NodeMerge(Node A,Node B){


Node C;
C.pre= max(A.pre,A.sum+B.pre);
C.suf=max(B.suf,B.sum+A.suf);

C.sum=A.sum+B.sum;

C.ans=max(A.ans,B.ans);
C.ans=max(C.ans,A.suf+B.pre);
return C;
}

int32_t main(){
fast

#ifndef ONLINE_JUDGE

freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
freopen("error.txt","w",stderr);

#endif

int t=1;
cin>>t;
while(t--){
int n;
cin>>n;
vector<int>v(n);
map<int,vector<int>>m;
for(int i=0;i<n;i++) {
tk(x);
m[x].pb(i);
v[i]=-1;
}

vector<Node>ans(4*n+5);
segmentree(ans,1,0,n-1,v);
int maxi=0,vl=0;
for(auto i:m){
vector<int>x=m[i.first];
for(auto j:x){
update(1,0,n-1,j,1,ans);
}

int val=ans[1].ans;
if(val>maxi) {
vl=i.first;
maxi=val;
}
for(auto j:x){
update(1,0,n-1,j,-1,ans);
}
}

for(auto i:m[vl]){
v[i]=1;
}
debug(v);
int ansl = -1, ansr = -1;
int sum = 0, lastl = 0;
int mx = 0;
for(int i = 0; i < n; ++i) {
sum += v[i];
if(sum > mx) {
mx = sum;
ansr = i;
ansl = lastl;
}
if(sum <= 0) {
lastl = i + 1;
sum = 0;
}
}
cout<<vl<<" "<<ansl+1<<" "<<ansr+1<<"\n";
}
return 0;
}

You might also like