#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
template < class S, class T> inline S chmax( S & a, T b) {
if ( a< b) {
a= b;
}
return a;
}
#define main dummy_main
int main( ) {
return 0 ;
}
#undef main
int N;
int cnt[ 100000 ] ;
class Solution{
public :
int maxEqualFreq( vector< int > & A) {
int i;
int k;
int x;
int y;
int res = 0 ;
set< int > s;
set< int > :: iterator it;
map< int ,int > mp;
N = A.size ( ) ;
for ( i= ( 0 ) ; i< ( 100000 ) ; i++ ) {
cnt[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
A[ i] -- ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
k = cnt[ A[ i] ] ;
if ( k) {
if ( -- mp[ k] == 0 ) {
s.erase ( k) ;
}
}
cnt[ A[ i] ] ++ ;
k = cnt[ A[ i] ] ;
if ( ( ++ mp[ k] ) == 1 ) {
s.insert ( k) ;
}
if ( s.size ( ) == 1 ) {
x = * s.begin ( ) ;
if ( x== 1 ) {
chmax( res, i + 1 ) ;
}
if ( mp[ x] == 1 ) {
chmax( res, i + 1 ) ;
}
}
if ( s.size ( ) == 2 ) {
it = s.begin ( ) ;
x = * ( it++ ) ;
y = * ( it++ ) ;
if ( x== 1 && mp[ x] == 1 ) {
chmax( res, i + 1 ) ;
}
if ( x+ 1 == y && mp[ y] == 1 ) {
chmax( res, i + 1 ) ;
}
}
}
return res;
}
}
;
// cLay varsion 20191102-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// int N;
// int cnt[1d5];
//
// class Solution {
// public:
// int maxEqualFreq(vector<int>& A) {
// int k, x, y, res = 0;
// set<int> s;
// set<int>::iterator it;
// map<int,int> mp;
//
// N = A.size();
// rep(i,1d5) cnt[i] = 0;
// rep(i,N) A[i]--;
//
// rep(i,N){
// k = cnt[A[i]];
// if(k) if(--mp[k]==0) s.erase(k);
// cnt[A[i]]++;
// k = cnt[A[i]];
// if((++mp[k])==1) s.insert(k);
// if(s.size()==1){
// x = *s.begin();
// if(x==1) res >?= i + 1;
// if(mp[x]==1) res >?= i + 1;
// }
// if(s.size()==2){
// it = s.begin();
// x = *(it++);
// y = *(it++);
// if(x==1 && mp[x]==1) res >?= i + 1;
// if(x+1==y && mp[y]==1) res >?= i + 1;
// }
// }
// return res;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnRlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+IGlubGluZSBTIGNobWF4KFMgJmEsIFQgYil7CiAgaWYoYTxiKXsKICAgIGE9YjsKICB9CiAgcmV0dXJuIGE7Cn0KI2RlZmluZSBtYWluIGR1bW15X21haW4KaW50IG1haW4oKXsKICByZXR1cm4gMDsKfQojdW5kZWYgbWFpbgppbnQgTjsKaW50IGNudFsxMDAwMDBdOwpjbGFzcyBTb2x1dGlvbnsKICBwdWJsaWM6CiAgaW50IG1heEVxdWFsRnJlcSh2ZWN0b3I8aW50PiYgQSl7CiAgICBpbnQgaTsKICAgIGludCBrOwogICAgaW50IHg7CiAgICBpbnQgeTsKICAgIGludCByZXMgPSAwOwogICAgc2V0PGludD4gczsKICAgIHNldDxpbnQ+OjppdGVyYXRvciBpdDsKICAgIG1hcDxpbnQsaW50PiBtcDsKICAgIE4gPSBBLnNpemUoKTsKICAgIGZvcihpPSgwKTtpPCgxMDAwMDApO2krKyl7CiAgICAgIGNudFtpXSA9IDA7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgQVtpXS0tOwogICAgfQogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGsgPSBjbnRbQVtpXV07CiAgICAgIGlmKGspewogICAgICAgIGlmKC0tbXBba109PTApewogICAgICAgICAgcy5lcmFzZShrKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY250W0FbaV1dKys7CiAgICAgIGsgPSBjbnRbQVtpXV07CiAgICAgIGlmKCgrK21wW2tdKT09MSl7CiAgICAgICAgcy5pbnNlcnQoayk7CiAgICAgIH0KICAgICAgaWYocy5zaXplKCk9PTEpewogICAgICAgIHggPSAqcy5iZWdpbigpOwogICAgICAgIGlmKHg9PTEpewogICAgICAgICAgY2htYXgocmVzLCBpICsgMSk7CiAgICAgICAgfQogICAgICAgIGlmKG1wW3hdPT0xKXsKICAgICAgICAgIGNobWF4KHJlcywgaSArIDEpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZihzLnNpemUoKT09Mil7CiAgICAgICAgaXQgPSBzLmJlZ2luKCk7CiAgICAgICAgeCA9ICooaXQrKyk7CiAgICAgICAgeSA9ICooaXQrKyk7CiAgICAgICAgaWYoeD09MSAmJiBtcFt4XT09MSl7CiAgICAgICAgICBjaG1heChyZXMsIGkgKyAxKTsKICAgICAgICB9CiAgICAgICAgaWYoeCsxPT15ICYmIG1wW3ldPT0xKXsKICAgICAgICAgIGNobWF4KHJlcywgaSArIDEpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlczsKICB9Cn0KOwovLyBjTGF5IHZhcnNpb24gMjAxOTExMDItMQoKLy8gLS0tIG9yaWdpbmFsIGNvZGUgLS0tCi8vICNkZWZpbmUgbWFpbiBkdW1teV9tYWluCi8vIHt9Ci8vICN1bmRlZiBtYWluCi8vIAovLyBpbnQgTjsKLy8gaW50IGNudFsxZDVdOwovLyAKLy8gY2xhc3MgU29sdXRpb24gewovLyBwdWJsaWM6Ci8vICAgaW50IG1heEVxdWFsRnJlcSh2ZWN0b3I8aW50PiYgQSkgewovLyAgICAgaW50IGssIHgsIHksIHJlcyA9IDA7Ci8vICAgICBzZXQ8aW50PiBzOwovLyAgICAgc2V0PGludD46Oml0ZXJhdG9yIGl0OwovLyAgICAgbWFwPGludCxpbnQ+IG1wOwovLyAKLy8gICAgIE4gPSBBLnNpemUoKTsKLy8gICAgIHJlcChpLDFkNSkgY250W2ldID0gMDsKLy8gICAgIHJlcChpLE4pIEFbaV0tLTsKLy8gCi8vICAgICByZXAoaSxOKXsKLy8gICAgICAgayA9IGNudFtBW2ldXTsKLy8gICAgICAgaWYoaykgaWYoLS1tcFtrXT09MCkgcy5lcmFzZShrKTsKLy8gICAgICAgY250W0FbaV1dKys7Ci8vICAgICAgIGsgPSBjbnRbQVtpXV07Ci8vICAgICAgIGlmKCgrK21wW2tdKT09MSkgcy5pbnNlcnQoayk7Ci8vICAgICAgIGlmKHMuc2l6ZSgpPT0xKXsKLy8gICAgICAgICB4ID0gKnMuYmVnaW4oKTsKLy8gICAgICAgICBpZih4PT0xKSByZXMgPj89IGkgKyAxOwovLyAgICAgICAgIGlmKG1wW3hdPT0xKSByZXMgPj89IGkgKyAxOwovLyAgICAgICB9Ci8vICAgICAgIGlmKHMuc2l6ZSgpPT0yKXsKLy8gICAgICAgICBpdCA9IHMuYmVnaW4oKTsKLy8gICAgICAgICB4ID0gKihpdCsrKTsKLy8gICAgICAgICB5ID0gKihpdCsrKTsKLy8gICAgICAgICBpZih4PT0xICYmIG1wW3hdPT0xKSByZXMgPj89IGkgKyAxOwovLyAgICAgICAgIGlmKHgrMT09eSAmJiBtcFt5XT09MSkgcmVzID4/PSBpICsgMTsKLy8gICAgICAgfQovLyAgICAgfQovLyAgICAgcmV0dXJuIHJlczsKLy8gICB9Ci8vIH07Cg==