Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define ll long long
- #define pii pair<int,int>
- #define pll pair<ll,ll>
- #define vi vector<int>
- #define vl vector<ll>
- #define mp make_pair
- #define pb push_back
- using namespace std;
- const int mxn = 1e5;
- int n, nxt[mxn], arr[mxn], tree[mxn*4];
- void update(int node, int l, int r, int pos, int value){
- if(l == r){
- tree[node] = value;
- }
- else{
- int mid = (l + r) / 2;
- if(pos <= mid)
- update(node * 2, l, mid, pos, value);
- else
- update(node * 2 + 1, mid + 1, r, pos, value);
- tree[node] = tree[node * 2] + tree[node * 2 + 1];
- }
- }
- int query(int node, int l, int r, int L, int R){
- if(l > R || r < L)
- return 0;
- if(L <= l && r <= R)
- return tree[node];
- int mid = (l + r) / 2;
- int left = query(node * 2, l, mid, L, R);
- int right = query(node * 2 + 1, mid + 1, r, L, R);
- return left + right;
- }
- int main(){
- cin>>n;
- for(int i = 0; i < n; i++){
- cin>>arr[i];
- }
- int lbl = 1;
- map<int,int> label;
- for(int i = 0; i < n; i++){
- if(label[arr[i]])
- continue;
- else{
- label[arr[i]] = lbl++;
- }
- }
- map<int,int> last;
- for(int i = 0; i < n; i++)
- nxt[i] = -1;
- for(int i = n - 1; i >= 0; i--){
- if(last[arr[i]]){
- nxt[i] = last[arr[i]];
- last[arr[i]] = i;
- }
- else{
- last[arr[i]] = i;
- }
- }
- int ans = 0;
- set<int> ones;
- for(int i = n - 1; i >= 0; i--){
- int l = i, r = nxt[i];
- if(nxt[i] == -1)
- continue;
- update(1, 0, n-1,nxt[i], 1);
- if(ones.find(nxt[i]+1) == ones.end());
- ones.insert(nxt[i]);
- if(nxt[nxt[i]] != -1){
- ones.erase(nxt[nxt[i]]);
- update(1, 0, n-1, nxt[nxt[i]], -1);
- }
- if(nxt[nxt[i]] != -1 && nxt[nxt[nxt[i]]] != -1){
- update(1, 0, n-1, nxt[nxt[nxt[i]]], 0);
- }
- for(int j : ones){
- if(j >= i)
- ans = max(ans, query(1, 0, n-1, i, j));
- }
- }
- cout<<ans<<endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement