Advertisement
Guest User

u302-i

a guest
Dec 6th, 2015
342
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.65 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <set>
  6. using namespace std;
  7. #define mk make_pair
  8. #define pb push_back
  9. const int maxn = 222222;
  10. const int inf = 1e9;
  11. int n;
  12. int x, p[maxn];
  13. int up[maxn], down[maxn];
  14. int derevo[maxn<<2];
  15. int num;
  16. int getmax(int l, int r){
  17.     l = num + l - 1;
  18.     r = num + r - 1;
  19.     int res = 0;
  20.     while(l <= r){
  21.         if(l % 2){
  22.             if(derevo[l] > res) res = derevo[l];
  23.             l ++;
  24.         }
  25.         if(r % 2 == 0){
  26.             if(derevo[r] > res) res = derevo[r];
  27.             r --;
  28.         }
  29.         l >>= 1;
  30.         r >>= 1;
  31.     }
  32.     return res;
  33. }
  34. void update(int pos, int val){
  35.     pos = num + pos - 1;
  36.     derevo[pos] = val;
  37.     pos >>= 1;
  38.     while(pos >= 1){
  39.         derevo[pos] = max(derevo[pos << 1], derevo[pos<<1|1]);
  40.         pos >>= 1;
  41.     }
  42. }
  43. int main(){
  44.     freopen("improvements.in","r",stdin);
  45.     freopen("improvements.out","w",stdout);
  46.     scanf("%d",&n);
  47.     for(int i = 1; i <= n; i ++){
  48.         scanf("%d",&x);
  49.         p[x] = i;
  50.     }
  51.     num = 1;
  52.     while(num <= n) num <<= 1;
  53.     for(int i = 1; i <= n; i ++){
  54.         int current = p[i];
  55.         int cr = 1 + getmax(1,current - 1);
  56.         up[i] = max(up[i-1], cr);
  57.         update(current, cr);
  58.     }
  59.     memset(derevo, 0, sizeof derevo);
  60.     for(int i = n; i > 0; i--){
  61.         int current = p[i];
  62.         int cr = 1 + getmax(1,current - 1);
  63.         down[i] = max(down[i+1], cr);
  64.         update(current, cr);
  65.     }
  66.     int ans = min(up[n],down[1]);
  67.     for(int i = 1; i < n; i ++) ans = max(ans, up[i] + down[i + 1]);
  68.     printf("%d\n", ans);
  69.    return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement