이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
 
// author : aykhn
 
using namespace std;
typedef long long ll;
 
#define pb push_back
#define ins insert
#define mpr make_pair
#define all(v) v.begin(), v.end()
#define bpc __builtin_popcountll
#define pii pair<ll, ll>
#define pll pair<ll, ll>
#define fi first
#define se second
#define int ll
#define infll 0x3F3F3F3F3F3F3F3F
#define inf 0x3F3F3F3F
const int MXN = 1e5 + 5;
int n, m, sz = 1;
int a[MXN], st[40*MXN];
void add(int l, int r, int x, int lx, int rx, int val)
{
    if (l >= rx || r <= lx) return;
    if (l >= lx && r <= rx)
    {
        st[x] += val;
        return;
    }
    int mid = (l + r) >> 1;
    add(l, mid, 2*x + 1, lx, rx, val);
    add(mid, r, 2*x + 2, lx, rx, val);
}
int get(int l, int r, int x, int ind)
{
    if (l + 1 == r) return st[x];
    int mid = (l + r) >> 1;
    if (ind < mid) return st[x] + get(l, mid, 2*x + 1, ind);
    else return st[x] + get(mid, r, 2*x + 2, ind);
}
signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr);
    cin >> n >> m;
    while (sz < 10*MXN) sz <<= 1;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 2; i <= n; i++)
    {
        int l = min(a[i - 1], a[i]);
        int r = max(a[i - 1], a[i]);
        if (l + 1 <= r - 1) add(0, sz, 0, l + 1, r, 1);
    }
    while (m--)
    {
        int t;
        cin >> t;
        if (t == 1)
        {
            int pos, val;
            cin >> pos >> val;
            if (pos > 1)
            {
                int l = min(a[pos - 1], a[pos]);
                int r = max(a[pos - 1], a[pos]);
                if (l + 1 <= r - 1) add(0, sz, 0, l + 1, r, -1);
            }
            if (pos < n)
            {
                int l = min(a[pos + 1], a[pos]);
                int r = max(a[pos + 1], a[pos]);
                if (l + 1 <= r - 1) add(0, sz, 0, l + 1, r, -1);
            }
            a[pos] = val;
            if (pos > 1)
            {
                int l = min(a[pos - 1], a[pos]);
                int r = max(a[pos - 1], a[pos]);
                if (l + 1 <= r - 1) add(0, sz, 0, l + 1, r, 1);
            }
            if (pos < n)
            {
                int l = min(a[pos + 1], a[pos]);
                int r = max(a[pos + 1], a[pos]);
                if (l + 1 <= r - 1) add(0, sz, 0, l + 1, r, 1);
            }
        }
        else
        {
            int h;
            cin >> h;
            cout << get(0, sz, 0, h) << '\n';
        }
    }
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |