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;
template<class T>struct fenwick {
vector<T> bit;
fenwick(int n) {
bit.assign(n + 5, 0);
}
void add(int i, T delta) {
for (; i < (int)bit.size(); i += i & -i)
bit[i] += delta;
}
T query(int i) {
T ans = 0;
for (; i; i -= i & -i) {
ans += bit[i];
}
return ans;
}
int kth(T val) {
int pos = 0;
for (int i = 17; i >= 0; --i) {
if (pos + (1 << i) < (int)bit.size() and bit[pos + (1 << i)] < val) {
pos += (1 << i);
val -= bit[pos];
}
}
return pos + 1;
}
};
struct Tree {
struct node {
int64_t sufmax, sum;
node(int64_t sufmax = 0, int64_t sum = 0):
sufmax(sufmax), sum(sum) {}
node operator + (const node &oth) const {
return node(max(oth.sufmax, sufmax + oth.sum),
sum + oth.sum);
}
};
vector<node> s; int n;
Tree(int n = 0) : s(2*n), n(n) {}
void update(int pos, int64_t val) {
for (s[pos += n] = node(max((int64_t)0, val), val); pos /= 2;)
s[pos] = s[pos * 2] + s[pos * 2 + 1];
}
node fquery(int b, int e) { // query [b, e)
node ra, rb;
for (b += n, e += n; b < e; b /= 2, e /= 2) {
if (b % 2) ra = ra + s[b++];
if (e % 2) rb = s[--e] + rb;
}
return ra + rb;
}
node query(int b, int e) {return fquery(b, e + 1); }
};
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int N, M, Q; cin >> N >> M >> Q;
fenwick<int64_t> tot(Q + 5);
Tree seg(Q + 5);
vector<vector<pair<int64_t, int64_t>>> queries(N + 5), fwupd(N + 5), upd(N + 5);
vector<int> group(Q + 5), res(Q + 5, -1);
for (int i = 1; i <= Q; ++i) {
int64_t op, a, b, c, k;
cin >> op;
if (op == 1) {
cin >> a >> b >> c >> k;
group[i] = c;
upd[a].emplace_back(i, k);
upd[b + 1].emplace_back(i, 0);
fwupd[a].emplace_back(i, k);
fwupd[b + 1].emplace_back(i, -k);
} else if (op == 2) {
cin >> a >> b >> k;
upd[a].emplace_back(i, -k);
upd[b + 1].emplace_back(i, 0);
} else {
cin >> a >> b;
queries[a].emplace_back(i, b);
}
}
for (int i = 1; i <= N; ++i) {
for (auto &[pos, val] : upd[i]) {
seg.update(pos, val);
}
for (auto &[pos, val] : fwupd[i]) {
tot.add(pos, val);
}
for (auto &[pos, val] : queries[i]) {
auto cur = seg.query(1, pos);
if (cur.sufmax >= val) {
int64_t kth = tot.query(pos) - (cur.sufmax - val);
res[pos] = group[tot.kth(kth)];
} else {
res[pos] = 0;
}
}
}
for (int i = 1; i <= Q; ++i) if (res[i] != -1) cout << res[i] << '\n';
}
Compilation message (stderr)
foodcourt.cpp: In function 'int main()':
foodcourt.cpp:88:16: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
88 | for (auto &[pos, val] : upd[i]) {
| ^
foodcourt.cpp:91:16: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
91 | for (auto &[pos, val] : fwupd[i]) {
| ^
foodcourt.cpp:94:16: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
94 | for (auto &[pos, val] : queries[i]) {
| ^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |