Cod sursa(job #2715383)

Utilizator sichetpaulSichet Paul sichetpaul Data 3 martie 2021 16:47:41
Problema Salvare Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <bits/stdc++.h>
#define Nmax 200002
using namespace std;

ifstream fin("prieteni2.in");
ofstream fout("prieteni2.out");

int N, Q, ans, curr;
int le[4 * Nmax], ri[4 * Nmax], bst[4 * Nmax];

void update(int node, int l, int r, int pos, int val) {
    if (l == r) le[node] = ri[node] = bst[node] = val;
    else {
        int mid = (l + r) / 2, x = 2 * node, y = 2 * node + 1;
        if (pos <= mid) update(x, l, mid, pos, val);
        else update(y, mid + 1, r, pos, val);

        le[node] = le[x], ri[node] = ri[y];
        if (le[x] == mid - l + 1) le[node] = max(le[node], le[x] + le[y]);
        if (ri[y] == r - mid) ri[node] = max(ri[node], ri[y] + ri[x]);

        bst[node] = max(bst[x], bst[y]);
        bst[node] = max(bst[node], ri[x] + le[y]);
    }
}
void query(int node, int l, int r, int a, int b) {
    if (l >= a && r <= b) {
        ans = max(ans, curr + le[node]);
        ans = max(ans, bst[node]);
        if (le[node] == r - l + 1) curr += le[node];
        else curr = ri[node];
    }
    else {
        int mid = (l + r) / 2;
        if (a <= mid) query(2 * node, l, mid, a, b);
        if (mid < b) query(2 * node + 1, mid + 1, r, a, b);
    }
}
int main()
{
    fin >> N >> Q;
    while (Q--) {
        int op, x, y;
        fin >> op;
        if (op == 3) {
            fin >> x >> y;
            ans = curr = 0;
            if (x < y) query(1, 1, N - 1, x, y - 1);
            fout << ans + 1 << '\n';
        }
        else {
            fin >> x;
            if (op == 1) update(1, 1, N - 1, x, 1);
            else update(1, 1, N - 1, x, 0);
        }
    }

    return 0;
}