제출 #173721

#제출 시각아이디문제언어결과실행 시간메모리
173721srvltSimple game (IZhO17_game)C++14
100 / 100
86 ms7036 KiB
//#pragma GCC optimize("Ofast")
//#pragma GCC target("avx,avx2,fma")
#include <bits/stdc++.h>

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ordered_set tree <pair <int, int>, null_type, less <pair <int, int> >, rb_tree_tag, tree_order_statistics_node_update>
using namespace __gnu_pbds;

#define ll long long
#define db double
#define pb push_back
#define ppb pop_back
#define fi first
#define se second
#define mp make_pair
#define size(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()

#define endl "\n"
//#define int long long

using namespace std;

void dout() {
    cerr << endl;
}
template <typename Head, typename... Tail>
void dout(Head H, Tail... T) {
    cerr << H << ' ';
    dout(T...);
}

//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef pair <int, int> pii;

const int N = 1e5 + 3, K = 1e6;
int n, m, a[N], fen[K + 3];

void upd(int x, int y) {
    for (; x <= K; x |= (x + 1)) {
        fen[x] += y;
    }
}

int get(int x) {
    int res = 0;
    for (; x >= 0; x = (x & (x + 1)) - 1) {
        res += fen[x];
    }
    return res;
}

void add(int l, int r) {
    if (l > r) {
        swap(l, r);
    }
    r--;
    if (l > r) {
        return;
    }
    upd(l, 1);
    upd(r + 1, -1);
}

void del(int l, int r) {
    if (l > r) {
        swap(l, r);
    }
    r--;
    if (l > r) {
        return;
    }
    upd(l, -1);
    upd(r + 1, 1);
}

void solve(int tc) {
    // check for (int i = 0; i < n; j++)
    cin >> n >> m;

    int l, r;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        if (i > 1) {
            l = a[i - 1], r = a[i];
            add(l, r);
        }
    }
    int t, pos, val, h;
    for (int i = 1; i <= m; i++) {
        cin >> t;
        if (t == 1) {
            cin >> pos >> val;
            if (pos > 1) {
                l = a[pos - 1], r = a[pos];
                del(l, r);

                l = a[pos - 1], r = val;
                add(l, r);
            }
            if (pos < n) {
                l = a[pos], r = a[pos + 1];
                del(l, r);

                l = val, r = a[pos + 1];
                add(l, r);
            }
            a[pos] = val;
        }   else {
            cin >> h;
            cout << get(h) << endl;
        }
    }
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
//    freopen("input.txt", "r", stdin);
//    freopen("output.txt", "w", stdout);
    int tc = 1;
//    cin >> tc;
    for (int i = 0; i < tc; i++) {
        solve(i);
//        cleanup();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...