Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define NguyenDangQuan the_author
- #include <bits/stdc++.h>
- #define all(x) x.begin(),x.end()
- #define mset(x, i) memset(x,i,sizeof(x))
- #define elif else if
- #define heap priority_queue
- #define fi first
- #define se second
- #define pb push_back
- #define ld long double
- #define ll long long
- #define ull unsigned long long
- using namespace std;
- int typetest;
- inline void fastIOfileinput(){
- ios_base:: sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- typetest = 0;
- }
- template<class T>
- void read(T &x){
- register int c;
- x = (T)0;
- while ((c = getchar()) <= 47 || c >= 58);
- for (; (c > 47 && c < 58); c = getchar()){
- x = (x << 3) + (x << 1) + (T)(c - 48);
- }
- }
- const int N = 1e5 + 2;
- const int Inf = 1e7 + 1;
- int n, a[N];
- int stmax[N * 4];
- void Enter(){
- //cin >> n;
- read(n);
- for(int i = 1; i <= n; ++i)
- //cin >> a[i];
- read(a[i]);
- }
- void build(int id, int l, int r){
- if(l == r){
- stmax[id] = a[l];
- return;
- }
- build(id << 1, l, (l + r) / 2);
- build(id << 1 | 1, (l + r) / 2 + 1, r);
- stmax[id] = max(stmax[id << 1], stmax[id << 1 | 1]);
- }
- int get(int id, int l, int r, int a, int b){
- if(l > b || r < a)
- return -Inf;
- if(l >= a && r <= b)
- return stmax[id];
- int s = get(id << 1, l, (l + r) / 2, a, b),
- p = get(id << 1 | 1, (l + r) / 2 + 1, r, a, b);
- return max(s, p);
- }
- int sum[4 * N];
- void updat(int id, int l, int r, int pos, int val){
- if(l > pos || r < pos)
- return;
- if(l == pos && r == pos){
- sum[id] = val;
- return;
- }
- updat(id << 1, l, (l + r) / 2, pos, val);
- updat(id << 1 | 1, (l + r) / 2 + 1, r, pos, val);
- sum[id] = sum[id << 1] + sum[id << 1 | 1];
- }
- int que(int id, int l, int r, int a, int b){
- if(l > b || r < a)
- return 0;
- if(l >= a && r <= b)
- return sum[id];
- return que(id << 1, l, (l + r) / 2, a, b) + que(id << 1 | 1, (l + r) / 2 + 1, r, a, b);
- }
- void solve(){
- build(1, 1, n);
- int res = 0;
- int last[N];
- for(int i = 1; i <= n; ++i){
- updat(1, 1, n, i, 1);
- updat(1, 1, n, last[a[i]], 0);
- last[a[i]] = i;
- for(int j = max(max(a[i], res + 1), i - last[1] + 1); j <= i && que(1, 1, n, i - j + 1, i) == j;){
- int s = get(1, 1, n, i - j + 1, i);
- if(s == j)
- res = max(res, j),
- ++j;
- else
- j = s;
- }
- }
- cout << res;
- }
- signed main(){
- fastIOfileinput();
- if(typetest){
- int t;
- cin >> t;
- while(t--){
- Enter();
- solve();
- }
- }
- else{
- Enter();
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment