이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "sequence.h"
#include <bits/stdc++.h>
#include <vector>
using namespace std;
#define ll long long
const ll inf = 1e9;
struct SGT {
    int n;
    vector<ll> mn;
    vector<ll> mx;
    vector<ll> d;
    void apply(int v, ll x) {
        d[v] += x;
                mn[v] += x;
                mx[v] += x;
    }
        void push(int v){
                apply(v + v, d[v]);
                apply(v + v + 1, d[v]);
                d[v] = 0;
        }
        void upd(int v){
                mn[v] = min(mn[v + v], mn[v + v + 1]);
                mx[v] = max(mx[v + v], mx[v + v + 1]);
        }
        void build(int v, int tl, int tr, vector<ll> &a){
                if(tl == tr){
                        mn[v] = a[tl];
                        mx[v] = a[tl];
                        return;
                }
                int tm = (tl + tr) / 2;
                build(v + v, tl, tm, a);
                build(v + v + 1, tm + 1, tr, a);
                upd(v);
        }
        void build(vector<ll> &a){
                n = a.size();
                d.assign(n * 4, 0);
                mn.resize(n * 4);
                mx.resize(n * 4);
                build(1, 0, n - 1, a);
        }
        void add(int v, int tl, int tr, int l, int r, ll x){
                if(tr < l || r < tl){
                        return;
                }
                if(l <= tl && tr <= r){
                        apply(v, x);
                        return;
                }
                int tm = (tl + tr) / 2;
                push(v);
                add(v + v, tl, tm, l, r, x);
                add(v + v + 1, tm + 1, tr, l, r, x);
                upd(v);
        }
        void add(int l, int r, ll x){
                add(1, 0, n - 1, l, r, x);
        }
        pair<ll, ll> get(int v, int tl, int tr, int l, int r){
                if(tr < l || r < tl){
                        return make_pair(inf, -inf);
                }
                if(l <= tl && tr <= r){
                        return make_pair(mn[v], mx[v]);
                }
                int tm = (tl + tr) / 2;
                push(v);
                auto [mn1, mx1] = get(v + v, tl, tm, l, r);
                auto [mn2, mx2] = get(v + v + 1, tm + 1, tr, l, r);
                return make_pair(min(mn1, mn2), max(mx1, mx2));
        }
        pair<ll, ll> get(int l, int r){
                return get(1, 0, n - 1, l, r);
        }
};
int n;
vector<int> a;
SGT sgt;
void solve_rec(vector<array<int, 5>> f, int &rs){
        int m = f.size();
        if(m == 1){
                return;
        }
        int s = m / 2;
        int t = m - s;
        vector<array<int, 5>> fl;
        vector<array<int, 5>> fr;
        for(int i = 0; i < m; i += 1){
                if(i < s){
                        fl.push_back(f[i]);
                } else{
                        fr.push_back(f[i]);
                }
        }
        solve_rec(fl, rs);
        solve_rec(fr, rs);
        int mn = inf;
        int mx = -inf;
        for(int i = 0; i < s; i += 1){
                auto [ps, mnl, mxl, mnr, mxr] = fl[i];
                mnl -= s - i;
                mxl += s - i;
                mn = mnl = min(mn, mnl);
                mx = mxl = max(mx, mxl);
                fl[i] = array<int,5>({ps, mnl, mxl, mnr, mxr});
        }
        mn = inf;
        mx = -inf;
        for(int i = t - 1; i >= 0; i -= 1){
                auto [ps, mnl, mxl, mnr, mxr] = fr[i];
                mnr -= i + 1;
                mxr += i + 1;
                mn = mnr = min(mn, mnr);
                mx = mxr = max(mx, mxr);
                fr[i] = array<int, 5>({ps, mnl, mxl, mnr, mxr});
        }
        int j = 0;
        for(int i = 0; i < t; i += 1){
                auto [psi, mnli, mxli, mnri, mxri] = fr[i];
                while(j < s){
                        auto [psj, mnlj, mxlj, mnrj, mxrj] = fl[j];
                        if(mnlj <= mxri && mnri <= mxlj){
                                break;
                        }
                        j += 1;
                }
                if(j == s){
                        break;
                }
                rs = max(rs, i + 1 + (s - j));
        }
}
int sequence(int N, std::vector<int> A) {
        n = N;
        a = A;
        vector<ll> sgt_init(n + 1);
        for(int i = 0; i <= n; i += 1){
                sgt_init[i] = i;
        }
        sgt.build(sgt_init);
        map<int, vector<int>> mp;
        for(int i = 0; i < n; i += 1){
                mp[a[i]].push_back(i);
        }
        int rs = 1;
        for(auto [x, pss]: mp){
                vector<array<int, 5>> f;
                for(auto i: pss){
                        sgt.add(i + 1, n, -1);
                }
                for(auto i: pss){
                        auto [lmn, lmx] = sgt.get(0, i);
                        auto [rmn, rmx] = sgt.get(i + 1, n);
                        f.push_back(array<int, 5>({i, lmn, lmx, rmn, rmx}));
                }
                solve_rec(f, rs);
                for(auto i: pss){
                        sgt.add(i + 1, n, -1);
                }
        }
    return rs;
}
컴파일 시 표준 에러 (stderr) 메시지
sequence.cpp: In function 'int sequence(int, std::vector<int>)':
sequence.cpp:183:55: warning: narrowing conversion of 'lmn' from 'std::tuple_element<0, std::pair<long long int, long long int> >::type' {aka 'long long int'} to 'int' [-Wnarrowing]
  183 |                         f.push_back(array<int, 5>({i, lmn, lmx, rmn, rmx}));
      |                                                       ^~~
sequence.cpp:183:60: warning: narrowing conversion of 'lmx' from 'std::tuple_element<1, std::pair<long long int, long long int> >::type' {aka 'long long int'} to 'int' [-Wnarrowing]
  183 |                         f.push_back(array<int, 5>({i, lmn, lmx, rmn, rmx}));
      |                                                            ^~~
sequence.cpp:183:65: warning: narrowing conversion of 'rmn' from 'std::tuple_element<0, std::pair<long long int, long long int> >::type' {aka 'long long int'} to 'int' [-Wnarrowing]
  183 |                         f.push_back(array<int, 5>({i, lmn, lmx, rmn, rmx}));
      |                                                                 ^~~
sequence.cpp:183:70: warning: narrowing conversion of 'rmx' from 'std::tuple_element<1, std::pair<long long int, long long int> >::type' {aka 'long long int'} to 'int' [-Wnarrowing]
  183 |                         f.push_back(array<int, 5>({i, lmn, lmx, rmn, rmx}));
      |                                                                      ^~~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |