Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- #include <vector>
- #include <set>
- using namespace std;
- #define mk make_pair
- #define pb push_back
- const int maxn = 222222;
- const int inf = 1e9;
- int n;
- int x, p[maxn];
- int up[maxn], down[maxn];
- int derevo[maxn<<2];
- int num;
- int getmax(int l, int r){
- l = num + l - 1;
- r = num + r - 1;
- int res = 0;
- while(l <= r){
- if(l % 2){
- if(derevo[l] > res) res = derevo[l];
- l ++;
- }
- if(r % 2 == 0){
- if(derevo[r] > res) res = derevo[r];
- r --;
- }
- l >>= 1;
- r >>= 1;
- }
- return res;
- }
- void update(int pos, int val){
- pos = num + pos - 1;
- derevo[pos] = val;
- pos >>= 1;
- while(pos >= 1){
- derevo[pos] = max(derevo[pos << 1], derevo[pos<<1|1]);
- pos >>= 1;
- }
- }
- int main(){
- freopen("improvements.in","r",stdin);
- freopen("improvements.out","w",stdout);
- scanf("%d",&n);
- for(int i = 1; i <= n; i ++){
- scanf("%d",&x);
- p[x] = i;
- }
- num = 1;
- while(num <= n) num <<= 1;
- for(int i = 1; i <= n; i ++){
- int current = p[i];
- int cr = 1 + getmax(1,current - 1);
- up[i] = max(up[i-1], cr);
- update(current, cr);
- }
- memset(derevo, 0, sizeof derevo);
- for(int i = n; i > 0; i--){
- int current = p[i];
- int cr = 1 + getmax(1,current - 1);
- down[i] = max(down[i+1], cr);
- update(current, cr);
- }
- int ans = min(up[n],down[1]);
- for(int i = 1; i < n; i ++) ans = max(ans, up[i] + down[i + 1]);
- printf("%d\n", ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement