제출 #1340911

#제출 시각아이디문제언어결과실행 시간메모리
1340911trungcanTjelesni (COCI26_tjelesni)C++20
0 / 110
154 ms4648 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 5;

int n, q, m, cur;
bool a[N];
int seg[N << 2][2], lazy[N << 2][2];

void build(int id, int l, int r){
    lazy[id][0] = lazy[id][1] = -1;
    if (l == r){
        seg[id][l & 1] = a[l];
        return;
    }

    int mid = l + ((r - l) >> 1);

    build(id << 1, l, mid); build((id << 1) | 1, mid + 1, r);
    seg[id][0] = seg[id << 1][0] + seg[(id << 1) | 1][0];
    seg[id][1] = seg[id << 1][1] + seg[(id << 1) | 1][1];
}

int cnt(int l, int r, int k){
    return (r >> 1) - ((l - 1) >> 1) + (k & 1 ? ((r - l + 1) & 1 ? (l & 1 ? 1 : -1) : 0) : 0);
}

void down(int id, int l, int r, int mid, int k){
    int &v = lazy[id][k];
    seg[id << 1][k] = !v ? 0 : cnt(l, mid, k);
    seg[(id << 1) | 1][k] = !v ? 0 : cnt(mid + 1, r, k);
    lazy[id << 1][k] = lazy[(id << 1) | 1][k] = v;
    v = -1;
}

int get(int id, int l, int r, int u, int v){
    if (r < u || v < l) return 0;
    if (u <= l && r <= v) return seg[id][0] + seg[id][1];

    int mid = l + ((r - l) >> 1);
    if (lazy[id][0] != -1) down(id, l, r, mid, 0);
    if (lazy[id][1] != -1) down(id, l, r, mid, 1);

    return get(id << 1, l, mid, u, v) + get((id << 1) | 1, mid + 1, r, u, v);
}

void update(int id, int l, int r, int u, int v, int k, int val){
    if (r < u || v < l) return;
    if (u <= l && r <= v){
        if (val)
            seg[id][k] = cnt(l, r, k);
        else
            seg[id][k] = 0;
        lazy[id][k] = val;
        return;
    }

    int mid = l + ((r - l) >> 1);
    if (lazy[id][k] != -1) down(id, l, r, mid, k);

    update(id << 1, l, mid, u, v, k, val);
    update((id << 1) | 1, mid + 1, r, u, v, k, val);

    seg[id][0] = seg[id << 1][0] + seg[(id << 1) | 1][0];
    seg[id][1] = seg[id << 1][1] + seg[(id << 1) | 1][1];

//    cout << l << " " << r << "\t\t" << seg[id][0] << " " << seg[id][1] << "\n";
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);

    cin >> n >> q >> m;
    for (int i = 1, x; i <= n; ++i){
        cin >> x;
        if (x == m) cur = i;
        a[i] = x < m;
    }

    build(1, 1, n);
//    cout << "\t"; for (int i = 1; i <= n; ++i) cout << get(1, 1, n, i, i) << " "; cout << "\n";
    while (q--){
        int l, r; cin >> l >> r;
        int c = l & 1;
        int num = get(1, 1, n, l, r), v = cnt(l, r, c);
        if (num > v){
            update(1, 1, n, l, r, c, 1);
            update(1, 1, n, l, r, c ^ 1, 0);
            update(1, 1, n, max(1, r - ((num - v) << 1) + 1), r, c ^ 1, 1);
            if (l <= cur && cur <= r)
                cur = r - ((num - v) << 1) - ((l & 1) == (r & 1) ? 1 : 0);
        } else {
            update(1, 1, n, l, r, c, 0);
            update(1, 1, n, l, r, c ^ 1, 0);
//            for (int i = 1; i <= n; ++i) cout << get(1, 1, n, i, i) << " "; cout << "\n";
            update(1, 1, n, l, min(l + (num << 1) - 1, n), c, 1);
            if (l <= cur && cur <= r)
                cur = (num == v ? r - ((l & 1) == (r & 1)) : l + (num << 1));
        }

//        cout << num << " " << v << "\t"; for (int i = 1; i <= n; ++i) cout << get(1, 1, n, i, i) << " "; cout << "\n";
    }

    cout << cur;
}

/*
7 3 3
4 2 3 7 1 6 5
4 7
3 5
1 4
*/


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...