Submission #1324659

#TimeUsernameProblemLanguageResultExecution timeMemory
1324659Valters07Sterilizing Spray (JOI15_sterilizing)C++20
10 / 100
57 ms4180 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
#define fio ios_base::sync_with_stdio(0);cin.tie(0);
#define ll long long
#define ld long double
#define en exit(0);
#define pb push_back
#define fi first
#define se second
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int N = 1e5 + 5;
int segt[4 * N], n;
void upd(int p, int v, int l = 1, int r = n, int pos = 1)
{
    if(l == r)
        segt[pos] = v;
    else
    {
        int mid = (l + r) / 2;
        if(p <= mid)
            upd(p, v, l, mid, pos * 2);
        else
            upd(p, v, mid + 1, r, pos * 2 + 1);
        segt[pos] = segt[pos * 2] + segt[pos * 2 + 1];
    }
}
int getsum(int lb, int rb, int l = 1, int r = n, int pos = 1)
{
    if(rb < l || r < lb)
        return 0;
    if(lb <= l && r <= rb)
        return segt[pos];
    int mid = (l + r) / 2;
    return getsum(lb, rb, l, mid, pos * 2) + getsum(lb, rb, mid + 1, r, pos * 2 + 1);
}
int main()
{
    fio
//    ifstream cin("in.in");
    int q, k;
    cin >> n >> q >> k;
    int c[n + 1];
    for(int i = 1;i <= n;i++)
        cin >> c[i];
    set<int> ones;
    for(int i = 1;i <= n;i++)
    {
        if(c[i] == 1)
        {
            ones.insert(i);
            upd(i, 1);
        }
    }
    while(q--)
    {
        int t;
        cin >> t;
        if(t == 1)
        {
            int p, v;
            cin >> p >> v;
            if(ones.count(p))
                ones.erase(p);
            upd(p, v);
            if(v == 1)
                ones.insert(p);
        }
        else if(t == 2)
        {
            int l, r;
            cin >> l >> r;
            if(k > 1)
            {
                auto t = ones.lower_bound(l);
                while(t != ones.end() && *t <= r)
                {
                    upd(*t, 0);
                    ones.erase(t);
                    t = ones.lower_bound(l);
                }
            }
        }
        else
        {
            int l, r;
            cin >> l >> r;
            cout << getsum(l, r) << "\n";
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...