这个板子有什么意义?
检测对编译器的了解程度。
template <class T, int N>
struct acarray {
T val[N], rev;
int tim, vis[N];
struct refer {
int *tim, *vis;
T *val, *rev;
refer() = delete;
refer(acarray& a, size_t pos)
: tim(&a.tim), vis(&a.vis[pos]), val(&a.val[pos]), rev(&a.rev) {}
operator T() const { return *vis < *tim ? *rev : *val; }
refer& operator=(const T& x) {
*vis = *tim;
*val = x;
return *this;
}
refer& operator=(const refer& r) { return *this = static_cast<T>(r); }
};
acarray() : tim(0) { memset(vis, 0, sizeof vis); }
refer operator[](size_t pos) { return refer(*this, pos); }
void reset(const T& r) {
++tim;
rev = r;
}
};
使用例:
template <class T, int N>
struct fenwick {
acarray<T, N + 10> t;
fenwick() { reset(); }
void modify(int p, T k) {
for (; p <= N; p += p & -p) t[p] = max(static_cast<int>(t[p]), k);
}
T query(int p) {
T r = -1;
for (; p >= 1; p -= p & -p) r = max(r, static_cast<int>(t[p]));
return r;
}
void reset() { t.reset(-1); }
};