Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <algorithm>
- #include <cstdio>
- using namespace std;
- int A[111111];
- int D[111111];
- int P[111111];
- int T[4444444];
- int query(int v, int tl, int tr, int l, int r) {
- if (l > r) return 111110;
- if (tl == l && tr == r) return T[v];
- int mm = (tl+tr)/2;
- int q1 = query(2*v+1, tl, mm, l, min(mm,r));
- int q2 = query(2*v+2, mm+1, tr, max(mm+1,l), r);
- if (D[q1] > D[q2]) return q1;
- return q2;
- }
- void update(int v, int tl, int tr, int pos, int x) {
- if (tl == tr) {
- T[v] = x;
- } else {
- int mm = (tl+tr)/2;
- if (pos <= mm) {
- update(2*v+1, tl, mm, pos, x);
- } else {
- update(2*v+2, mm+1, tr, pos, x);
- }
- int q1 = T[2*v+1], q2 = T[2*v+2];
- T[v] = (D[q1] > D[q2]) ? q1 : q2;
- }
- }
- int main(void) {
- int n;
- int ans = 1, st = 0;
- freopen("input.txt", "rt", stdin);
- freopen("output.txt", "wt", stdout);
- D[111110] = -1000000;
- for (int i = 0; i < 111111; i++) { D[i] = -1000000000; P[i] = 111110; }
- for (int i = 0; i < 4444444; i++) { T[i] = 111110; }
- cin >> n;
- for (int i = 0; i < n; i++) {
- cin >> A[i];
- }
- for (int i = 0; i < n; i++) {
- int mx1 = query(1,0,1000000,0,A[i]-2);
- int mx2 = query(1,0,1000000,A[i]+2,1000000);
- int mx3 = query(1,0,1000000,A[i],A[i]);
- if (D[mx2] > D[mx1]) mx1 = mx2;
- if (D[mx3] > D[mx1]) mx1 = mx3;
- D[i] = max(D[mx1],0) + 1;
- P[i] = mx1;
- update(1,0,1000000,A[i],i);
- if (D[i] > ans) {
- ans = D[i];
- st = i;
- }
- }
- cout << n-ans << endl;
- vector<int> R;
- while (st != 111110) {
- R.push_back(A[st]);
- st = P[st];
- }
- for (int i = (int)R.size()-1; i >= 0; i--) {
- cout << R[i] << " ";
- }
- cout << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement