Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- /* Madara Uchiha */
- #define TRACE
- #ifdef TRACE
- #define dbgarr(a,n) cerr << "["; for(int i = 0; i < n; ++i) cerr << a[i] << " ";cerr << "\b]\n";
- #define dbg(args...) {debug,args; cerr<<endl;}
- #define pause() cin.get();cin.get();
- #else
- #define dbgarr(a,n)
- #define dbg(args...)
- #define pause()
- #endif
- struct debugger {
- template<typename T> debugger& operator , (const T& v) {
- cerr<<v<<" "; return *this;
- }
- } debug;
- template <typename T1, typename T2>
- inline ostream& operator << (ostream& os, const pair<T1, T2>& p) {
- return os << "(" << p.first << ", " << p.second << ")";
- }
- template<typename T>
- inline ostream &operator << (ostream & os,const vector<T>& v) {
- bool first = true; os << "[";
- for (typename vector<T>::const_iterator ii = v.begin(); ii != v.end(); ++ii) {
- if(!first) os << ", ";
- os << *ii; first = false;
- }
- return os << "]";
- }
- #define each(i,c) for(__typeof((c).begin()) i=(c).begin();i!=(c).end();i++)
- #define fr first
- #define se second
- typedef long long LL;
- typedef pair<int,int> pii;
- typedef vector<int> vi;
- // for each i find (a,b,c,d) ,such that d = i and a is max
- const int NN = (1 << 20);
- int match[NN], seg[2*NN];
- int inp[NN], od[NN];
- int nxt[NN], prev[NN];
- void update(int node,int st,int en,int ind){
- if (st == en){
- seg[node] = nxt[ind];
- return;
- }
- int mid = (st+en)/2;
- if (mid >= ind) update(2*node,st,mid,ind);
- else update(2*node+1,mid+1,en,ind);
- seg[node] = max(seg[2*node],seg[2*node+1]);
- }
- int query(int node,int st,int en,int L,int R,int rng){
- if (st > R or en < L or st > en) return -1;
- if (st >= L and en <= R){
- if (seg[node] <= rng) return -1;
- if (st == en) return st;
- int mid = (st+en)/2;
- if (seg[2*node+1] > rng)
- return query(2*node+1,mid+1,en,L,R,rng);
- return query(2*node,st,mid,L,R,rng);
- }
- int mid = (st+en)/2, ans = -1;
- if (mid >= L)
- ans = max(ans,query(2*node,st,mid,L,R,rng));
- if (mid+1 <= R)
- ans = max(ans,query(2*node+1,mid+1,en,L,R,rng));
- return ans;
- }
- bool cmp1(int x,int y){
- if (inp[x] == inp[y])
- return (x < y);
- return (inp[x] < inp[y]);
- }
- bool cmp2(int x,int y){
- if (nxt[x] == nxt[y])
- return (x < y);
- return (nxt[x] < nxt[y]);
- }
- void solve(){
- int n;
- cin >> n;
- memset(seg,-1,sizeof(seg));
- for(int i = 0; i < n; ++i){
- cin >> inp[i], od[i] = i;
- nxt[i] = n+5, prev[i] = -2;
- match[i] = -1;
- }
- sort(od,od+n,cmp1);
- for(int i = 0; i < n; ++i){
- int x = od[i];
- if (i+1 < n and inp[od[i+1]] == inp[x] and od[i+1] > x+1)
- nxt[x] = od[i+1];
- else if (i+2 < n and inp[od[i+2]] == inp[x])
- nxt[x] = od[i+2];
- if (i-1 >= 0 and inp[od[i-1]] == inp[x] and od[i-1] < x-1)
- prev[x] = od[i-1];
- else if (i-2 >= 0 and inp[od[i-2]] == inp[x])
- prev[x] = od[i-2];
- assert(nxt[i] > i+1);
- assert(prev[i] < i-1);
- }
- for(int i = 0; i < n; ++i)
- od[i] = i;
- sort(od,od+n,cmp2);
- for(int i = 0, j = 0; i < n; ++i){
- while(j < n and nxt[od[j]] < i)
- update(1,0,n-1,od[j]), ++j;
- int x = prev[i];
- if (x <= 0) continue;
- match[i] = query(1,0,n-1,0,x-1,x);
- }
- vi ans;
- for(int i = 0, k = 0; i < n; ++i){
- if (match[i] >= k){
- ans.push_back(match[i]);
- ans.push_back(i);
- ans.push_back(match[i]);
- ans.push_back(i);
- k = i+1;
- }
- }
- int m = (int)ans.size();
- cout << m << endl;
- for(int i = 0; i < m; ++i)
- cout << inp[ans[i]] << " ";
- cout << endl;
- }
- int main()
- {
- ios_base::sync_with_stdio(0);
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement