Submission #1123063

#TimeUsernameProblemLanguageResultExecution timeMemory
1123063cpptowinRuka (COI15_ruka)C++20
0 / 100
2 ms576 KiB
#include <bits/stdc++.h>
#define fo(i, d, c) for (int i = d; i <= c; i++)
#define fod(i, c, d) for (int i = c; i >= d; i--)
#define maxn 200010
#define N 1010
#define fi first
#define se second
#define pb emplace_back
#define en cout << "\n";
#define inf 50000010
#define bitcount(x) __builtin_popcountll(x)
#define pii pair<int, int>
#define vii vector<pii>
#define lb(x) x & -x
#define bit(i, j) ((i >> j) & 1)
#define offbit(i, j) (i ^ (1LL << j))
#define onbit(i, j) (i | (1LL << j))
#define vi vector<int>
#define all(x) x.begin(), x.end()
#define ss(x) (int)x.size()
template <typename T1, typename T2>
bool minimize(T1 &a, T2 b) {
    if (a > b) {
        a = b;
        return true;
    }
    return false;
}
template <typename T1, typename T2>
bool maximize(T1 &a, T2 b) {
    if (a < b) {
        a = b;
        return true;
    }
    return false;
}
using namespace std;
const int nsqrt = 450;
const int mod = 1e9 + 7;
void add(int &x, int k) {
    x += k;
    x %= mod;
    if (x < 0)
        x += mod;
}
void del(int &x, int k) {
    x -= k;
    x %= mod;
    if (x < 0)
        x += mod;
}
struct TRIE {
    struct node {
        node *child[2];
        int cnt = 0;
        node() {
            for (int i = 0; i < 2; i++) child[i] = NULL;
        }
    };
    node *root;
    int cur = 0;
    TRIE() : cur(0) { root = new node(); };
    void clear() { root = new node(); }
    void add(int num) {
        node *p = root;
        for (int i = 28; i >= 0; i--) {
            int c = (num >> i) & 1;
            if (p->child[c] == NULL) {
                p->child[c] = new node();
            }
            p = p->child[c];
            p->cnt++;
        }
    }

    bool find(int x) {
        node *p = root;
        for (int i = 28; i >= 0; i--) {
            int c = (x >> i) & 1;
            if (p->child[c] == nullptr || p->child[c]->cnt == 0) {
                return false;
            }
            p = p->child[c];
        }
        return true;
    }

    bool remove(node *p, int x, int i) {
        if (i >= 0) {
            int c = (x >> i) & 1;
            if (remove(p->child[c], x, i - 1))
                p->child[c] = nullptr;
        }

        if (p != root) {
            p->cnt--;
            if (p->cnt == 0) {
                delete (p);
                return true;
            }
        }
        return false;
    }

    void remove(int x) {
        if (!find(x)) {
            return;
        }
        remove(root, x, 28);
    }

    int maxxor(int x) {
        node *p = root;
        int res = 0;
        for (int i = 28; i >= 0; i--) {
            int c = (x >> i) & 1;
            if (p->child[c ^ 1] != nullptr) {
                res += (1 << i);
                p = p->child[c ^ 1];
            } else
                p = p->child[c];
        }
        return res;
    }
    int getsmaller(int x) {
        int ans = 0;
        node *p = root;
        fod(i, 28, 0) {
            int t = bit(x, i);
            if (t == 1) {
                if (p->child[0] != NULL)
                    ans += p->child[0]->cnt;
                if (p->child[1] != NULL)
                    p = p->child[1];
                else
                    return ans;
            }
            if (t == 0) {
                if (p->child[0] != NULL)
                    p = p->child[0];
                else
                    return ans;
            }
        }
        return ans;
    }
} minn[4], maxx[4];
int n, q, ans;
array<int, 2> ff;
array<int, 2> a[maxn];
int f[maxn][2];
int now[2];
main() {
#define name "TASK"
    if (fopen(name ".inp", "r")) {
        freopen(name ".inp", "r", stdin);
        freopen(name ".out", "w", stdout);
    }
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n;
    f[0][0] = f[0][1] = 1;
    fo(i, 1, n) fo(j, 0, 1) {
        cin >> a[i][j];
        f[i][j] = f[i - 1][j] + a[i][j];
    }
    fod(i, n - 1, 1) fo(j, 0, 1) {
        minn[j].add(min(f[i][j], f[i + 1][j]) + inf);
        maxx[j].add(max(f[i][j], f[i + 1][j]) + inf);
    }
    fo(j, 0, 1) {
        minn[j + 2].add(min(f[0][j], f[1][j]) + inf);
        maxx[j + 2].add(max(f[0][j], f[1][j]) + inf);
    }
    int id = 1;
    int q;
    cin >> q;
    while (q--) {
        char t;
        cin >> t;
        if (t == 'B') {
            fo(j, 0, 1) {
                minn[j + 2].remove(min(f[id - 1][j], f[id][j] + now[j]) + inf);
                maxx[j + 2].remove(max(f[id - 1][j], f[id][j] + now[j]) + inf);
                f[id - 1][j] -= now[j];
                minn[j].add(min(f[id][j], f[id - 1][j]) + inf);
                maxx[j].add(max(f[id][j], f[id - 1][j]) + inf);
            }
            id--;
        } else if (t == 'F') {
            fo(j, 0, 1) {
                minn[j].remove(min(f[id][j], f[id + 1][j]) + inf);
                maxx[j].remove(max(f[id][j], f[id + 1][j]) + inf);
                f[id][j] += now[j];
                minn[j + 2].add(min(f[id][j], f[id + 1][j] + now[j]) + inf);
                maxx[j + 2].add(max(f[id][j], f[id + 1][j] + now[j]) + inf);
            }
            id++;
        } else if (t == 'C') {
            cin >> ff[0] >> ff[1];
            fo(j, 0, 1) {
                minn[j + 2].remove(min(f[id - 1][j], f[id][j] + now[j]) + inf);
                maxx[j + 2].remove(max(f[id - 1][j], f[id][j] + now[j]) + inf);
                now[j] += ff[j] - a[id][j];
                minn[j + 2].add(min(f[id - 1][j], f[id][j] + now[j]) + inf);
                maxx[j + 2].add(max(f[id - 1][j], f[id][j] + now[j]) + inf);
            }
            a[id] = ff;
        } else {
            ans = 0;
            fo(j, 0, 1) {
                ans += minn[j].getsmaller(-now[j] + inf) - maxx[j].getsmaller(-now[j] + inf);
                ans += minn[j + 2].getsmaller(inf) - maxx[j + 2].getsmaller(inf);
            }
            cout << ans;
            en;
        }
    }
}

Compilation message (stderr)

ruka.cpp:153:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  153 | main() {
      | ^~~~
ruka.cpp: In function 'int main()':
ruka.cpp:156:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  156 |         freopen(name ".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
ruka.cpp:157:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  157 |         freopen(name ".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...