RT,Wa on test 12。
// Author: Floze3
// Time: 2024-07-29 16:23:04
// Problem: P1997 faebdc 的烦恼
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1997
// Memory Limit: 128 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
#define mp(x, y) std::make_pair(x, y)
#define eb emplace_back
#define fi first
#define se second
#define il inline
#define all(x) x.begin(), x.end()
#define file(name) \
freopen(name ".in", "r", stdin); \
freopen(name ".out", "w", stdout);
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef std::pair<int, int> pii;
typedef std::vector<int> vi;
const int N = 1e5 + 5;
const int mod = 998244353;
const int inf = 0x3f3f3f3f;
const ll infll = 0x3f3f3f3f3f3f3f3f;
int n, q, a[N];
struct dat {
int lc, rc, l_len, r_len, ans, len;
il dat operator + (const dat &rhs) {
dat tmp;
tmp.lc = lc, tmp.rc = rhs.rc, tmp.ans = std::max(ans, rhs.ans), tmp.len = len + rhs.len;
tmp.l_len = l_len, tmp.r_len = rhs.r_len;
if (rc == rhs.lc) tmp.ans = std::max(tmp.ans, r_len + rhs.l_len);
if (rc == rhs.lc && len == r_len) tmp.l_len = std::max(tmp.l_len, l_len + rhs.l_len);
if (rc == rhs.lc && rhs.len == rhs.l_len) tmp.r_len = std::max(tmp.r_len, rhs.l_len + r_len);
return tmp;
}
};
struct node {
int l, r;
dat x;
#define ls (p << 1)
#define rs (p << 1 | 1)
#define mid (t[p].l + t[p].r >> 1)
} t[N << 2];
il void build(int p, int l, int r) {
t[p].l = l, t[p].r = r;
if (l == r) return t[p].x = {a[l], a[l], 1, 1, 1, 1}, void();
build(ls, l, mid), build(rs, mid + 1, r);
return t[p].x = t[ls].x + t[rs].x, void();
}
il dat query(int p, int l, int r) {
if (t[p].l >= l && t[p].r <= r) return t[p].x;
if (r <= mid) return query(ls, l, r);
if (l > mid) return query(rs, l, r);
return query(ls, l, r) + query(rs, l, r);
}
il void solve() {
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; ++i)
scanf("%d", a + i);
build(1, 1, n);
assert(t[1].x.lc == a[1] && t[1].x.rc == a[n]);
while (q--) {
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", query(1, l, r).ans);
}
return ;
}
signed main() {
int _ = 1;
while (_--) solve();
return 0;
}
/*
all the things you do
the words you say
will all come back to you
*/