社区讨论

一直 90 多求卡

P5609[Ynoi2013] 对数据结构的爱参与者 5已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@mhz4bmpn
此快照首次捕获于
2025/11/15 01:14
4 个月前
此快照最后确认于
2025/11/16 13:50
4 个月前
查看原帖
不想写内存池/ll
CPP
#include<bits/stdc++.h>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define int long long
using namespace std;
int n, q, mod, a[1000005], las;
namespace FastIO {
// ------------------------------
 #define IN_HAS_NEG
 #define OUT_HAS_NEG
 #define CHK_EOF
#define DISABLE_MMAP
// ------------------------------
#if __cplusplus < 201400
#error Please use C++14 or higher.
#endif
#if __cplusplus > 201700
#define INLINE_V inline
#else
#define INLINE_V
#endif
#if (defined(LOCAL) || defined(_WIN32)) && !defined(DISABLE_MMAP)
#define DISABLE_MMAP
#endif
#ifndef DISABLE_MMAP
#include <sys/mman.h>
#endif
#ifdef LOCAL
inline char gc() { return getchar(); }
inline void pc(char c) { putchar(c); }
#else
#ifdef DISABLE_MMAP
INLINE_V constexpr int _READ_SIZE = 1 << 18;
INLINE_V static char _read_buffer[_READ_SIZE], *_read_ptr = nullptr,
                                               *_read_ptr_end = nullptr;
inline char gc() {
    if (__builtin_expect(_read_ptr == _read_ptr_end, false)) {
        _read_ptr = _read_buffer;
        _read_ptr_end =
            _read_buffer + fread(_read_buffer, 1, _READ_SIZE, stdin);
#ifdef CHK_EOF
        if (__builtin_expect(_read_ptr == _read_ptr_end, false)) return EOF;
#endif
    }
    return *_read_ptr++;
}
#else
INLINE_V static const char *_read_ptr =
    (const char *)mmap(nullptr, INT_MAX, 1, 2, 0, 0);
inline char gc() { return *_read_ptr++; }
#endif
INLINE_V constexpr int _WRITE_SIZE = 1 << 18;
INLINE_V static char _write_buffer[_WRITE_SIZE], *_write_ptr = _write_buffer;
inline void pc(char c) {
    *_write_ptr++ = c;
    if (__builtin_expect(_write_buffer + _WRITE_SIZE == _write_ptr, false)) {
        fwrite(_write_buffer, 1, _write_ptr - _write_buffer, stdout);
        _write_ptr = _write_buffer;
    }
}
INLINE_V struct _auto_flush {
    ~_auto_flush() {
        fwrite(_write_buffer, 1, _write_ptr - _write_buffer, stdout);
    }
} _auto_flush;
#endif
#ifdef CHK_EOF
inline bool _isdigit(char c) { return (c & 16) && c != EOF; }
inline bool _isgraph(char c) { return c > 32 && c != EOF; }
#else
inline bool _isdigit(char c) { return c & 16; }
inline bool _isgraph(char c) { return c > 32; }
#endif
template <class T>
INLINE_V constexpr bool _is_integer = numeric_limits<T>::is_integer;
template <class T>
INLINE_V constexpr bool _is_signed = numeric_limits<T>::is_signed;
template <class T>
INLINE_V constexpr bool _is_unsigned = _is_integer<T> && !_is_signed<T>;
template <>
INLINE_V constexpr bool _is_integer<__int128> = true;
template <>
INLINE_V constexpr bool _is_integer<__uint128_t> = true;
template <>
INLINE_V constexpr bool _is_signed<__int128> = true;
template <>
INLINE_V constexpr bool _is_unsigned<__uint128_t> = true;
#undef INLINE_V
inline void read(char &c) {
    do c = gc();
    while (!_isgraph(c));
}
inline void read_cstr(char *s) {
    char c = gc();
    while (!_isgraph(c)) c = gc();
    while (_isgraph(c)) *s++ = c, c = gc();
    *s = 0;
}
inline void read(string &s) {
    char c = gc();
    s.clear();
    while (!_isgraph(c)) c = gc();
    while (_isgraph(c)) s.push_back(c), c = gc();
}
#ifdef IN_HAS_NEG
template <class T, enable_if_t<_is_signed<T>, int> = 0>
inline void read(T &x) {
    char c = gc();
    bool f = true;
    x = 0;
    while (!_isdigit(c)) {
        if (c == 45) f = false;
        c = gc();
    }
    if (f)
        while (_isdigit(c)) x = x * 10 + (c & 15), c = gc();
    else
        while (_isdigit(c)) x = x * 10 - (c & 15), c = gc();
}
template <class T, enable_if_t<_is_unsigned<T>, int> = 0>
#else
template <class T, enable_if_t<_is_integer<T>, int> = 0>
#endif
inline void read(T &x) {
    char c = gc();
    while (!_isdigit(c)) c = gc();
    x = 0;
    while (_isdigit(c)) x = x * 10 + (c & 15), c = gc();
}
inline void write(char c) { pc(c); }
inline void write_cstr(const char *s) {
    while (*s) pc(*s++);
}
inline void write(const string &s) {
    for (char c : s) pc(c);
}
#ifdef OUT_HAS_NEG
template <class T, enable_if_t<_is_signed<T>, int> = 0>
inline void write(T x) {
    char buffer[numeric_limits<T>::digits10 + 1];
    int digits = 0;
    if (x >= 0) do
            buffer[digits++] = (x % 10) | 48, x /= 10;
        while (x);
    else {
        pc(45);
        do buffer[digits++] = -(x % 10) | 48, x /= 10;
        while (x);
    }
    while (digits) pc(buffer[--digits]);
}
template <class T, enable_if_t<_is_unsigned<T>, int> = 0>
#else
template <class T, enable_if_t<_is_integer<T>, int> = 0>
#endif
inline void write(T x) {
    char buffer[numeric_limits<T>::digits10 + 1];
    int digits = 0;
    do buffer[digits++] = (x % 10) | 48, x /= 10;
    while (x);
    while (digits) pc(buffer[--digits]);
}
template <int N>
struct _tuple_io_helper {
    template <class... T>
    static inline void _read(tuple<T...> &x) {
        _tuple_io_helper<N - 1>::_read(x), read(get<N - 1>(x));
    }
    template <class... T>
    static inline void _write(const tuple<T...> &x) {
        _tuple_io_helper<N - 1>::_write(x), pc(32), write(get<N - 1>(x));
    }
};
template <>
struct _tuple_io_helper<1> {
    template <class... T>
    static inline void _read(tuple<T...> &x) {
        read(get<0>(x));
    }
    template <class... T>
    static inline void _write(const tuple<T...> &x) {
        write(get<0>(x));
    }
};
template <class... T>
inline void read(tuple<T...> &x) {
    _tuple_io_helper<sizeof...(T)>::_read(x);
}
template <class... T>
inline void write(const tuple<T...> &x) {
    _tuple_io_helper<sizeof...(T)>::_write(x);
}
template <class T1, class T2>
inline void read(pair<T1, T2> &x) {
    read(x.first), read(x.second);
}
template <class T1, class T2>
inline void write(const pair<T1, T2> &x) {
    write(x.first), pc(32), write(x.second);
}
template <class T1, class... T2>
inline void read(T1 &x, T2 &...y) {
    read(x), read(y...);
}
template <class... T>
inline void read_cstr(char *x, T *...y) {
    read_cstr(x), read_cstr(y...);
}
template <class T1, class... T2>
inline void write(const T1 &x, const T2 &...y) {
    write(x), write(y...);
}
template <class... T>
inline void write_cstr(const char *x, const T *...y) {
    write_cstr(x), write_cstr(y...);
}
template <class T>
inline void print(const T &x) {
    write(x);
}
inline void print_cstr(const char *x) { write_cstr(x); }
template <class T1, class... T2>
inline void print(const T1 &x, const T2 &...y) {
    print(x), pc(32), print(y...);
}
template <class... T>
inline void print_cstr(const char *x, const T *...y) {
    print_cstr(x), print_cstr(y...);
}
inline void println() {}
inline void println_cstr() {}
template <class... T>
inline void println(const T &...x) {
    print(x...), pc(10);
}
template <class... T>
inline void println_cstr(const T *...x) {
    print_cstr(x...), pc(10);
}
}  // namespace FastIO
using namespace FastIO;
/*inline vector<int>::iterator Upper_bound(vector<int>::iterator First, vector<int>::iterator Last, int KeyValue){
	vector<int>::iterator l = First, r = Last - 1, ans = Last;
	while (l <= r){
		vector<int>::iterator mid = l + (r - l >> 1);
		if (*mid > KeyValue)
			ans = mid, r = mid - 1;
		else
			l = mid + 1;
	}
	return ans;
}*/
const int inf = LLONG_MAX >> 2;
struct sgt{
	int tr[4000005];
	vector<int> vec[4000005];
	inline void pup(int u, int l, int r){
		int mid = (l + r) >> 1;
		tr[u] = tr[u << 1] + tr[u << 1 | 1];
		register int posl = 0, posr = 0;
		while (posl <= mid - l + 1){
			(posr == r - mid + 1) && (posr--);
			while (posr <= r - mid){
				if (vec[u << 1 | 1][posr] > vec[u << 1][posl + 1] + tr[u << 1] - 1 - posl * mod){
				//	cerr << "awa\n";
					posr--;
					break;
				}
				vec[u][posl + posr] = min(vec[u][posl + posr], max(vec[u << 1][posl], vec[u << 1 | 1][posr] - tr[u << 1] + posl * mod));
				posr++;
			}
			posl++;
		}
	}
	void build(int u, int l, int r){
	//	cerr << u << " " << l << " " << r << "\n";
		vec[u].resize(r - l + 3);
		vec[u][0] = LLONG_MIN >> 2;
		for (int i = 1; i <= r - l + 2; i++)
			vec[u][i] = inf;
		if (l == r){
			tr[u] = a[l];
			vec[u][1] = mod - a[l];
			return;
		}
		int mid = (l + r) >> 1;
		build(u << 1, l, mid);
		build(u << 1 | 1, mid + 1, r);
		pup(u, l, r);
	//	cerr << u << ":";
	//	for (auto awa : vec[u])
	//		cerr << awa << " ";
	//	cerr << "\n";
	}
	int qry(int u, int l, int r, int L, int R, int x){
	//	cerr << u << " " << l << " " << r << " " << x << "\n";
	//	system("pause");
	//	cerr << u << " " << tr[u] << "\n";
		if (L <= l && r <= R){
			int pos = upper_bound(vec[u].begin(), vec[u].end(), x) - vec[u].begin() - 1;
			return x + tr[u] - pos * mod; 
		}
		int mid = (l + r) >> 1;
		if (R <= mid)
			return qry(u << 1, l, mid, L, R, x);
		if (L > mid)
			return qry(u << 1 | 1, mid + 1, r, L, R, x);
		return qry(u << 1 | 1, mid + 1, r, mid + 1, R, qry(u << 1, l, mid, L, mid, x));
	}
}Sgt;
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	read(n);
	read(q);
	read(mod);
#pragma unroll(6)
	for (register int i = 1; i <= n; i++)
		read(a[i]);
	Sgt.build(1, 1, n);
	while (q--){
		int l, r, x;
		read(l);
		read(r);
		read(x);
        //cout << l << " " << r << " " << x << "\n";
		las = (las + (n << 40)) % n;
		l ^= las;
		r ^= las;
		x ^= las;
		las = Sgt.qry(1, 1, n, l, r, x);
		println(las);
     //   putchar('\n');
	}
	return 0;
}

回复

10 条回复,欢迎继续交流。

正在加载回复...