QOJ.ac

QOJ

IDSubmission IDProblemHackerOwnerResultSubmit timeJudge time
#922#592743#9302. Caesar Ciphership2077real_sigma_teamSuccess!2024-09-28 07:51:072024-09-28 07:51:09

Details

Extra Test:

Wrong Answer
time: 1ms
memory: 9824kb

input:

100 1
0 21 0 0 17 13 0 22 0 12 14 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 23 0 11 0 0 13 3 0 8 8 0 3 13 0 0 11 0 23 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 14 12 0 22 0 13 17 0 0 21 0
2 1 51 50

output:

yes

result:

wrong answer expected NO, found YES [1st token]

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#592743#9302. Caesar Cipherreal_sigma_team#WA 1046ms54424kbC++233.4kb2024-09-27 02:25:462024-10-13 20:40:38

answer

#include <bits/stdc++.h>
#include <immintrin.h>

using namespace std;

using ll = long long;
using ld = long double;
# define x first
# define y second
# define all(x) x.begin(), x.end()
# define rall(x) x.rbegin(), x.rend()

mt19937 mt(123);

void solve();
void init();

int32_t main() {
#ifndef LOCAL
    cin.tie(nullptr)->sync_with_stdio(false);
#endif
    init();
    cout << fixed << setprecision(10);
    int t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }
}

#define int ll

mt19937 rng(time(0));

int mod = (1ll << 61) - 1;

int base = 133769;

int add(int a, int b) {
    return a + b >= mod ? a + b - mod : a + b;
}
int sub(int a, int b) {
    return a >= b ? a - b : a + mod - b;
}
int mul(int a, int b) {
    return (__int128_t)1 * a * b % mod;
}

const int N = 5e5 + 10;

struct elem {
    int hsh = 0, sz = 0;

    elem() = default;
    elem(int x) : hsh(x), sz(1) {}
};

int mx[4 * N], lazy[4 * N], sum[N], pw[N];
elem tr[4 * N];

elem operator+(elem left, elem right) {
    elem res;
    res.hsh = add(left.hsh, mul(pw[left.sz], right.hsh));
    res.sz = left.sz + right.sz;
    return res;
}

void apply(int node, int x) {
    mx[node] += x;
    tr[node].hsh = add(tr[node].hsh, mul(x, sum[tr[node].sz]));
    lazy[node] += x;
}
void push(int node) {
    apply(node << 1, lazy[node]);
    apply(node << 1 | 1, lazy[node]);
    lazy[node] = 0;
}

int a[N];
void build(int node, int l, int r) {
    if (l == r) {
        mx[node] = a[l];
        tr[node] = elem(a[l]);
    } else {
        int m = (l + r) / 2;
        build(node << 1, l, m);
        build(node << 1 | 1, m + 1, r);
        tr[node] = tr[node << 1] + tr[node << 1 | 1];
        mx[node] = max(mx[node << 1], mx[node << 1 | 1]);
    }
}

void update(int ql, int qr, int node, int l, int r) {
    if (r < ql || qr < l) return;
    if (ql <= l && r <= qr) {
        if (l == r) {
            mx[node] = (mx[node] + 1) % 65536;
            tr[node] = elem(mx[node]);
            return;
        } else if (mx[node] + 1 < 65536) {
            apply(node, 1ll);
            return;
        }
    }
    int m = (l + r) / 2;
    push(node);
    update(ql, qr, node << 1, l, m);
    update(ql, qr, node << 1 | 1, m + 1, r);
    tr[node] = tr[node << 1] + tr[node << 1 | 1];
    mx[node] = max(mx[node << 1], mx[node << 1 | 1]);
}

elem get(int ql, int qr, int node, int l, int r) {
    if (r < ql || qr < l) return elem();
    if (ql <= l && r <= qr) return tr[node];
    int m = (l + r) / 2;
    push(node);
    return get(ql, qr, node << 1, l, m) + get(ql, qr, node << 1 | 1, m + 1, r);
}

void init() {}

void solve() {
    while (base <= 1e5) base = rng();
    int n, q;
    cin >> n >> q;
    pw[0] = 1;
    for (int i = 1; i < n; ++i) pw[i] = mul(pw[i - 1], base);
    for (int i = 0; i < n; ++i) sum[i + 1] = add(sum[i], pw[i]);
    for (int i = 0; i < n; ++i) cin >> a[i];
    build(1, 0, n - 1);
    while (q--) {
        int type;
        cin >> type;
        if (type == 1) {
            int l, r;
            cin >> l >> r;
            --l, --r;
            update(l, r, 1, 0, n - 1);
        } else {
            int a, b, len;
            cin >> a >> b >> len;
            --a, --b;
            if (get(a, a + len - 1, 1, 0, n - 1).hsh == get(b, b + len - 1, 1, 0, n - 1).hsh) cout << "yes\n";
            else cout << "no\n";
        }
    }
}