Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- int a[10001], t[10001], r[10001], n, l, i;
- int r1[10001], r2[10001];
- int ceil(int v)
- {
- int init = 0, fin = l;
- while(init < fin-1)
- {
- int m = (init+fin)/2;
- if(a[t[m]] >= v)
- fin = m;
- else
- init = m;
- }
- if(a[t[init]] >= v)
- return init;
- return fin;
- }
- void lis()
- {
- r[0] = 1;
- t[0] = 0;
- l = 0;
- for(i=1; i<n; i++)
- {
- if(a[i] > a[t[l]])
- {
- r[i] = r[t[l]]+1;
- l++;
- t[l] = i;
- }
- else
- {
- int p = ceil(a[i]);
- r[i] = r[t[p]];
- t[p] = i;
- }
- }
- }
- int max(int u, int v)
- {
- return (u > v ? u : v);
- }
- int min(int u, int v)
- {
- return (u < v ? u : v);
- }
- int main()
- {
- while(scanf("%d", &n) == 1)
- {
- for(i=0; i<n; i++)
- scanf("%d", &a[i]);
- lis();
- for(i=0; i<n; i++)
- r1[i] = r[i];
- for(i=0; i<n/2; i++)
- {
- int c = a[i];
- a[i] = a[n-i-1];
- a[n-i-1] = c;
- }
- lis();
- for(i=0; i<n; i++)
- r2[i] = r[n-1-i];
- int maxRes = 1;
- for(i=0; i<n; i++)
- maxRes = max(min(r1[i], r2[i])*2 - 1, maxRes);
- printf("%d\n", maxRes);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment