This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
int altura[MAXN];
vector<int> e, d, sum, lz;
int create()
{
    e.push_back(0);
    d.push_back(0);
    sum.push_back(0);
    lz.push_back(0);
    return sum.size()-1;
}
void refresh(int pos, int ini, int fim)
{
    if (pos == 0 || lz[pos] == 0) return;
    sum[pos] += lz[pos] * (fim - ini + 1);
    if (ini != fim)
    {
        if (e[pos] == 0)
        {
            int aux = create();
            e[pos] = aux;
        }
        if (d[pos] == 0)
        {
            int aux = create();
            d[pos] = aux;
        }
        lz[e[pos]] += lz[pos];
        lz[d[pos]] += lz[pos];
    }
    lz[pos] = 0;
}
void update(int pos, int ini, int fim, int p, int q, int val)
{
    if (p > q) swap(p, q);
    refresh(pos, ini, fim);
    if (pos == 0) return;
    if (q < ini || p > fim) return;
    if (p <= ini && fim <= q)
    {
        lz[pos] += val;
        refresh(pos, ini, fim);
        return;
    }
    int m = (ini + fim) >> 1;
    if (e[pos] == 0)
    {
        int aux = create();
        e[pos] = aux;
    }
    if (d[pos] == 0)
    {
        int aux = create();
        d[pos] = aux;
    }
    update(e[pos], ini,  m , p, q, val);
    update(d[pos], m+1, fim, p, q, val);
    sum[pos] = sum[e[pos]] + sum[d[pos]];
}
int query(int pos, int ini, int fim, int p, int q)
{
    if (p > q) swap(p, q);
    refresh(pos, ini, fim);
    if (pos == 0) return 0;
    if (q < ini || p > fim) return 0;
    if (p <= ini && fim <= q) return sum[pos];
    int m = (ini + fim) >> 1;
    return query(e[pos], ini, m, p, q) + query(d[pos], m+1, fim, p, q);
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    create(); create();
    int N, M;
    cin >> N >> M;
    for (int i = 1; i <= N; i++) cin >> altura[i];
    altura[0] = -1; altura[N+1] = -1;
    for (int i = 2; i <= N; i++)
    {
        int lastH = altura[i-1];
        int novoH = altura[i];
        update(1, 1, 1e6 + 10, lastH, novoH, 1);
    }
    for (int m = 1; m <= M; m++)
    {
        int type;
        cin >> type;
        if (type == 1)
        {
            int X, val;
            cin >> X >> val;
            int lastH = altura[X-1]; int nextH = altura[X+1];
            if (lastH != -1) {update(1, 1, 1e6 + 10, lastH, altura[X], -1); update(1, 1, 1e6 + 10, lastH, val, +1);}
            if (nextH != -1) {update(1, 1, 1e6 + 10, nextH, altura[X], -1); update(1, 1, 1e6 + 10, nextH, val, +1);}
            altura[X] = val;
        }
        else
        {
            int H;
            cin >> H;
            cout << query(1, 1, 1e6 + 10, H, 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... |