Submission #516905

#TimeUsernameProblemLanguageResultExecution timeMemory
516905blueStreet Lamps (APIO19_street_lamps)C++17
Compilation error
0 ms0 KiB
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <set>
using namespace std;

using vi = vector<int>;
using vvi = vector<vi>;
using pii = pair<int, int>;
using vpii = vector<pii>;

const int mx = 300'000;

int n, q;
int s[1+mx];

set<int> offpoints;




int Z = (1<<19);

struct stamp_tree
{
    vi stamp = vi(Z<<1, 0);

    void set(int l, int r, int t)
    {
        l += Z;
        r += Z+1;
        while(l < r)
        {
            if(l & 1) stamp[l++] = t;
            if(r & 1) stamp[--r] = t;
            l >>= 1;
            r >>= 1;
        }
    }

    int query(int i)
    {
        int ans = 0;
        for(i += Z; i >= 1; i >>= 1) ans = max(ans, stamp[i]);
        return ans;
    }
};

stamp_tree stt;










// vvi total_time = vvi(1+mx, vi(1+mx, 0));

struct col_tree
{
    int lp = 0;

    col_tree* left = NULL;
    col_tree* right = NULL;

    col_tree()
    {
        ;
    }

    col_tree(int L, int R)
    {
        ;
    }

    void add(int l, int r, int L, int R, int V)
    {
        // cerr << "col add\n";
        if(R < l || r < L) return;
        else if(L <= l && r <= R)
        {
            lp += V;
        }
        else
        {
            if(L <= (l+r)/2)
            {
                if(left == NULL) left = new col_tree(l, (l+r)/2);
                left->add(l, (l+r)/2, L, R, V);
            }

            if(R >= (l+r)/2+1)
            {
                if(right == NULL) right = new col_tree((l+r)/2+1, r);
                right->add((l+r)/2+1, r, L, R, V);
            }
        }
    }

    void  add(int L, int R, int V) {add(1, n, L, R, V);}

    int query(int l, int r, int I)
    {
        // cerr << "col query\n";
        if(l == r) return lp;
        else if(I <= (l+r)/2)
        {
            if(left == NULL) return lp;
            else return lp + left->query(l, (l+r)/2, I);
        }
        else
        {
            if(right == NULL) return lp;
            else return lp + right->query((l+r)/2+1, r, I);
        }
    }

    int query(int I) {return query(1, n, I);}
};







struct row_tree
{
    int l;
    int r;

    col_tree lp;

    row_tree* left = NULL;
    row_tree* right = NULL;

    row_tree()
    {
        ;
    }

    row_tree(int L, int R)
    {
        l = L;
        r = R;
        lp = col_tree(1, n);
    }

    void add(int L, int R, int X, int Y, int V)
    {
        if(R < l || r < L) return;
        else if(L <= l && r <= R) lp.add(X, Y, V);
        else
        {
            if(L <= (l+r)/2)
            {
                if(left == NULL) left = new row_tree(l, (l+r)/2);
                left->add(L, R, X, Y, V);
            }

            if(R > (l+r)/2)
            {
                if(right == NULL) right = new row_tree((l+r)/2+1, r);
                right->add(L, R, X, Y, V);
            }
        }
    }

    int query(int I, int J)
    {
        if(l == r) return lp.query(J);
        else if(I <= (l+r)/2)
        {
            if(left == NULL) return lp.query(J);
            else return left->query(I, J) + lp.query(J);
        }
        else
        {
            if(right == NULL) return lp.query(J);
            else return right->query(I, J) + lp.query(J);
        }
    }
};






// col_tree ST[1+mx];
row_tree ST;






int get_value(int l, int r)
{
 // return ST[l].query(r);
    return ST.query(l, r);
}

void range_add(int l, int r, int x, int y, int v)
{
    // for(int i = l; i <= r; i++)
    //     ST[i].add(x, y, v);
    ST.add(l, r, x, y, v);
}














void add_triangle(int l, int r, int t)
{
    stt.set(l, r, t);
}

void remove_triangle(int l, int r, int t)
{
    int tt = stt.query(l);
    range_add(l, r, l, r, t - tt);
}

void switch_on(int i, int t)
{
    offpoints.erase(i);

    auto it = offpoints.lower_bound(i);
    int r = *it;
    it--;
    int l = *it;

    remove_triangle(l+1, i-1, t);
    remove_triangle(i+1, r-1, t);
    add_triangle(l+1, r-1, t);
}

void switch_off(int i, int t)
{
    auto it = offpoints.lower_bound(i);
    int r = *it;
    it--;
    int l = *it;

    offpoints.insert(i);

    remove_triangle(l+1, r-1, t);
    add_triangle(l+1, i-1, t);
    add_triangle(i+1, r-1, t);
}

int query(int l, int r, int t)
{
    int y = *offpoints.lower_bound(l);
    if(y > r) return get_value(l, r) + t - stt.query(l);
    else return get_value(l, r);
}
























int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n >> q;

    string t;
    cin >> t;

    for(int i = 0; i < n; i++)
        s[i+1] = (t[i] == '1');

    for(int i = 1; i <= n; i++)
        if(s[i] == 0)
            offpoints.insert(i);

    offpoints.insert(0);
    offpoints.insert(n+1);

    // for(int i = 1; i <= n; i++) ST[i] = col_tree(1, n);
    ST = row_tree(1, n);


    for(int j = 1; j <= q; j++)
    {
        string qr;
        cin >> qr;
        if(qr == "toggle")
        {
            int i;
            cin >> i;

            if(s[i] == 0)
            {
                s[i] = 1;
                switch_on(i, j);
            }
            else
            {
                s[i] = 0;
                switch_off(i, j);
            }
        }
        else
        {
            int a, b;
            cin >> a >> b;

            cout << query(a, b-1, j) << '\n';
        }
    }
}
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <set>
using namespace std;

using vi = vector<int>;
using vvi = vector<vi>;
using pii = pair<int, int>;
using vpii = vector<pii>;

const int mx = 300'000;

int n, q;
int s[1+mx];

set<int> offpoints;




int Z = (1<<19);

struct stamp_tree
{
    vi stamp = vi(Z<<1, 0);

    void set(int l, int r, int t)
    {
        l += Z;
        r += Z+1;
        while(l < r)
        {
            if(l & 1) stamp[l++] = t;
            if(r & 1) stamp[--r] = t;
            l >>= 1;
            r >>= 1;
        }
    }

    int query(int i)
    {
        int ans = 0;
        for(i += Z; i >= 1; i >>= 1) ans = max(ans, stamp[i]);
        return ans;
    }
};

stamp_tree stt;










// vvi total_time = vvi(1+mx, vi(1+mx, 0));

struct col_tree
{
    int lp = 0;

    col_tree* left = NULL;
    col_tree* right = NULL;

    col_tree()
    {
        ;
    }

    col_tree(int L, int R)
    {
        ;
    }

    void add(int l, int r, int L, int R, int V)
    {
        // cerr << "col add\n";
        if(R < l || r < L) return;
        else if(L <= l && r <= R)
        {
            lp += V;
        }
        else
        {
            if(L <= (l+r)/2)
            {
                if(left == NULL) left = new col_tree(l, (l+r)/2);
                left->add(l, (l+r)/2, L, R, V);
            }

            if(R >= (l+r)/2+1)
            {
                if(right == NULL) right = new col_tree((l+r)/2+1, r);
                right->add((l+r)/2+1, r, L, R, V);
            }
        }
    }

    void  add(int L, int R, int V) {add(1, n, L, R, V);}

    int query(int l, int r, int I)
    {
        // cerr << "col query\n";
        if(l == r) return lp;
        else if(I <= (l+r)/2)
        {
            if(left == NULL) return lp;
            else return lp + left->query(l, (l+r)/2, I);
        }
        else
        {
            if(right == NULL) return lp;
            else return lp + right->query((l+r)/2+1, r, I);
        }
    }

    int query(int I) {return query(1, n, I);}
};







struct row_tree
{
    int l;
    int r;

    col_tree lp;

    row_tree* left = NULL;
    row_tree* right = NULL;

    row_tree()
    {
        ;
    }

    row_tree(int L, int R)
    {
        l = L;
        r = R;
        lp = col_tree(1, n);
    }

    void add(int L, int R, int X, int Y, int V)
    {
        if(R < l || r < L) return;
        else if(L <= l && r <= R) lp.add(X, Y, V);
        else
        {
            if(L <= (l+r)/2)
            {
                if(left == NULL) left = new row_tree(l, (l+r)/2);
                left->add(L, R, X, Y, V);
            }

            if(R > (l+r)/2)
            {
                if(right == NULL) right = new row_tree((l+r)/2+1, r);
                right->add(L, R, X, Y, V);
            }
        }
    }

    int query(int I, int J)
    {
        if(l == r) return lp.query(J);
        else if(I <= (l+r)/2)
        {
            if(left == NULL) return lp.query(J);
            else return left->query(I, J) + lp.query(J);
        }
        else
        {
            if(right == NULL) return lp.query(J);
            else return right->query(I, J) + lp.query(J);
        }
    }
};






// col_tree ST[1+mx];
row_tree ST;






int get_value(int l, int r)
{
 // return ST[l].query(r);
    return ST.query(l, r);
}

void range_add(int l, int r, int x, int y, int v)
{
    // for(int i = l; i <= r; i++)
    //     ST[i].add(x, y, v);
    ST.add(l, r, x, y, v);
}














void add_triangle(int l, int r, int t)
{
    stt.set(l, r, t);
}

void remove_triangle(int l, int r, int t)
{
    int tt = stt.query(l);
    range_add(l, r, l, r, t - tt);
}

void switch_on(int i, int t)
{
    offpoints.erase(i);

    auto it = offpoints.lower_bound(i);
    int r = *it;
    it--;
    int l = *it;

    remove_triangle(l+1, i-1, t);
    remove_triangle(i+1, r-1, t);
    add_triangle(l+1, r-1, t);
}

void switch_off(int i, int t)
{
    auto it = offpoints.lower_bound(i);
    int r = *it;
    it--;
    int l = *it;

    offpoints.insert(i);

    remove_triangle(l+1, r-1, t);
    add_triangle(l+1, i-1, t);
    add_triangle(i+1, r-1, t);
}

int query(int l, int r, int t)
{
    int y = *offpoints.lower_bound(l);
    if(y > r) return get_value(l, r) + t - stt.query(l);
    else return get_value(l, r);
}
























int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n >> q;

    string t;
    cin >> t;

    for(int i = 0; i < n; i++)
        s[i+1] = (t[i] == '1');

    for(int i = 1; i <= n; i++)
        if(s[i] == 0)
            offpoints.insert(i);

    offpoints.insert(0);
    offpoints.insert(n+1);

    // for(int i = 1; i <= n; i++) ST[i] = col_tree(1, n);
    ST = row_tree(1, n);


    for(int j = 1; j <= q; j++)
    {
        string qr;
        cin >> qr;
        if(qr == "toggle")
        {
            int i;
            cin >> i;

            if(s[i] == 0)
            {
                s[i] = 1;
                switch_on(i, j);
            }
            else
            {
                s[i] = 0;
                switch_off(i, j);
            }
        }
        else
        {
            int a, b;
            cin >> a >> b;

            cout << query(a, b-1, j) << '\n';
        }
    }
}

Compilation message (stderr)

street_lamps.cpp:362:11: error: redefinition of 'const int mx'
  362 | const int mx = 300'000;
      |           ^~
street_lamps.cpp:13:11: note: 'const int mx' previously defined here
   13 | const int mx = 300'000;
      |           ^~
street_lamps.cpp:364:5: error: redefinition of 'int n'
  364 | int n, q;
      |     ^
street_lamps.cpp:15:5: note: 'int n' previously declared here
   15 | int n, q;
      |     ^
street_lamps.cpp:364:8: error: redefinition of 'int q'
  364 | int n, q;
      |        ^
street_lamps.cpp:15:8: note: 'int q' previously declared here
   15 | int n, q;
      |        ^
street_lamps.cpp:365:5: error: redefinition of 'int s [300001]'
  365 | int s[1+mx];
      |     ^
street_lamps.cpp:16:5: note: 'int s [300001]' previously declared here
   16 | int s[1+mx];
      |     ^
street_lamps.cpp:367:10: error: redefinition of 'std::set<int> offpoints'
  367 | set<int> offpoints;
      |          ^~~~~~~~~
street_lamps.cpp:18:10: note: 'std::set<int> offpoints' previously declared here
   18 | set<int> offpoints;
      |          ^~~~~~~~~
street_lamps.cpp:372:5: error: redefinition of 'int Z'
  372 | int Z = (1<<19);
      |     ^
street_lamps.cpp:23:5: note: 'int Z' previously defined here
   23 | int Z = (1<<19);
      |     ^
street_lamps.cpp:374:8: error: redefinition of 'struct stamp_tree'
  374 | struct stamp_tree
      |        ^~~~~~~~~~
street_lamps.cpp:25:8: note: previous definition of 'struct stamp_tree'
   25 | struct stamp_tree
      |        ^~~~~~~~~~
street_lamps.cpp:399:12: error: redefinition of 'stamp_tree stt'
  399 | stamp_tree stt;
      |            ^~~
street_lamps.cpp:50:12: note: 'stamp_tree stt' previously declared here
   50 | stamp_tree stt;
      |            ^~~
street_lamps.cpp:412:8: error: redefinition of 'struct col_tree'
  412 | struct col_tree
      |        ^~~~~~~~
street_lamps.cpp:63:8: note: previous definition of 'struct col_tree'
   63 | struct col_tree
      |        ^~~~~~~~
street_lamps.cpp:480:8: error: redefinition of 'struct row_tree'
  480 | struct row_tree
      |        ^~~~~~~~
street_lamps.cpp:131:8: note: previous definition of 'struct row_tree'
  131 | struct row_tree
      |        ^~~~~~~~
street_lamps.cpp:544:10: error: redefinition of 'row_tree ST'
  544 | row_tree ST;
      |          ^~
street_lamps.cpp:195:10: note: 'row_tree ST' previously declared here
  195 | row_tree ST;
      |          ^~
street_lamps.cpp:551:5: error: redefinition of 'int get_value(int, int)'
  551 | int get_value(int l, int r)
      |     ^~~~~~~~~
street_lamps.cpp:202:5: note: 'int get_value(int, int)' previously defined here
  202 | int get_value(int l, int r)
      |     ^~~~~~~~~
street_lamps.cpp:557:6: error: redefinition of 'void range_add(int, int, int, int, int)'
  557 | void range_add(int l, int r, int x, int y, int v)
      |      ^~~~~~~~~
street_lamps.cpp:208:6: note: 'void range_add(int, int, int, int, int)' previously defined here
  208 | void range_add(int l, int r, int x, int y, int v)
      |      ^~~~~~~~~
street_lamps.cpp:577:6: error: redefinition of 'void add_triangle(int, int, int)'
  577 | void add_triangle(int l, int r, int t)
      |      ^~~~~~~~~~~~
street_lamps.cpp:228:6: note: 'void add_triangle(int, int, int)' previously defined here
  228 | void add_triangle(int l, int r, int t)
      |      ^~~~~~~~~~~~
street_lamps.cpp:582:6: error: redefinition of 'void remove_triangle(int, int, int)'
  582 | void remove_triangle(int l, int r, int t)
      |      ^~~~~~~~~~~~~~~
street_lamps.cpp:233:6: note: 'void remove_triangle(int, int, int)' previously defined here
  233 | void remove_triangle(int l, int r, int t)
      |      ^~~~~~~~~~~~~~~
street_lamps.cpp:588:6: error: redefinition of 'void switch_on(int, int)'
  588 | void switch_on(int i, int t)
      |      ^~~~~~~~~
street_lamps.cpp:239:6: note: 'void switch_on(int, int)' previously defined here
  239 | void switch_on(int i, int t)
      |      ^~~~~~~~~
street_lamps.cpp:602:6: error: redefinition of 'void switch_off(int, int)'
  602 | void switch_off(int i, int t)
      |      ^~~~~~~~~~
street_lamps.cpp:253:6: note: 'void switch_off(int, int)' previously defined here
  253 | void switch_off(int i, int t)
      |      ^~~~~~~~~~
street_lamps.cpp:616:5: error: redefinition of 'int query(int, int, int)'
  616 | int query(int l, int r, int t)
      |     ^~~~~
street_lamps.cpp:267:5: note: 'int query(int, int, int)' previously defined here
  267 | int query(int l, int r, int t)
      |     ^~~~~
street_lamps.cpp:646:5: error: redefinition of 'int main()'
  646 | int main()
      |     ^~~~
street_lamps.cpp:297:5: note: 'int main()' previously defined here
  297 | int main()
      |     ^~~~