이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "sequence.h"
#include <bits/stdc++.h>
using namespace std;
struct Node {
  int mn = 1e9, mx = -1e9, lazy = 0;
  friend Node merge(Node a, Node b) {
    Node c;
    c.mn = min(a.mn, b.mn);
    c.mx = max(a.mx, b.mx);
    return c;
  }
};
struct SegmentTree {
  int n;
  vector<Node> t;
  SegmentTree(int _n) {
    n = _n;
    t.assign(4 * n, Node());
  }
  void operate(int x, int v) {
    t[x].mn += v;
    t[x].mn += v;
    t[x].lazy += v;
  }
  void push(int x, int lx, int rx) {
    if (lx == rx) return;
    operate(x << 1, t[x].lazy);
    operate(x << 1 | 1, t[x].lazy);
    t[x].lazy = 0;
  }
  void build(int x, int lx, int rx) {
    if (lx == rx) {
      t[x].mn = t[x].mx = 0;
      return;
    }
    int mx = (lx + rx) >> 1;
    build(x << 1, lx, mx);
    build(x << 1 | 1, mx + 1, rx);
    t[x] = merge(t[x << 1], t[x << 1 | 1]);
  }
  void update(int x, int lx, int rx, int l, int r, int v) {
    if (t[x].lazy) push(x, lx, rx);
    if (lx > r || l > rx) return;
    if (l <= lx && r >= rx) {
      operate(x, v);
      return;
    }
    int mx = (lx + rx) >> 1;
    update(x << 1, lx, mx, l, r, v);
    update(x << 1 | 1, mx + 1, rx, l, r, v);
    t[x] = merge(t[x << 1], t[x << 1 | 1]);
  }
  Node query(int x, int lx, int rx, int l, int r) {
    if (t[x].lazy) push(x, lx, rx);
    if (l > rx || lx > r) return Node();
    if (l <= lx && r >= rx) return t[x];
    int mx = (lx + rx) >> 1;
    return merge(query(x << 1, lx, mx, l, r), query(x << 1 | 1, mx + 1, rx, l, r));
  }
};
int sequence(int n, vector<int> a) {
  vector<int> pos[n + 1];
  for (int i = 0; i < n; i++) {
    pos[a[i]].push_back(i + 1);
  }
  SegmentTree st1(n), st2(n);
  st1.build(1, 1, n);
  st2.build(1, 1, n);
  for (int i = 1; i <= n; i++) {
    st1.update(1, 1, n, i, n, 1);
    st2.update(1, 1, n, i, n, 1);
  }
  int ans = 0;
  for (int x = 1; x <= n; x++) {
    for (int i : pos[x]) st1.update(1, 1, n, i, n, -2);
    for (int i = 0; i < pos[x].size(); i++) {
      while (i + ans < pos[x].size()) {
        int x1 = pos[x][i], x2 = pos[x][i + ans];
        Node l1 = st1.query(1, 1, n, 1, x1 - 1), r1 = st1.query(1, 1, n, x2, n);
        Node l2 = st2.query(1, 1, n, 1, x1 - 1), r2 = st2.query(1, 1, n, x2, n);
        l1.mx = max(l1.mx, 0), l2.mx = max(l2.mx, 0);
        l1.mn = min(l1.mn, 0), l2.mn = min(l2.mn, 0);
        int mn = r1.mn - l1.mx;
        int mx = r2.mx - l2.mn;
        if (mx >= 0 && mn <= 0) {
          ans++;
        } else {
          break;
        }
      }
    }
    for (int i : pos[x]) st2.update(1, 1, n, i, n, -2);
  }
  return ans;
}
컴파일 시 표준 에러 (stderr) 메시지
sequence.cpp: In function 'int sequence(int, std::vector<int>)':
sequence.cpp:76:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |     for (int i = 0; i < pos[x].size(); i++) {
      |                     ~~^~~~~~~~~~~~~~~
sequence.cpp:77:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   77 |       while (i + ans < pos[x].size()) {
      |              ~~~~~~~~^~~~~~~~~~~~~~~| # | 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... |