#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int MAXN = 25e4+5;
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
#define pb push_back
#define mk make_pair
#define fr first
#define sc second
int n, m, q;
ll segP[4*MAXN], seg[4*MAXN], lazyP[4*MAXN];
vector<int> ls[MAXN], Q[MAXN];
void prop(int node, int leaf) {
segP[node] += lazyP[node];
if(!leaf) {
lazyP[2*node] += lazyP[node];
lazyP[2*node+1] += lazyP[node];
}
lazyP[node] = 0;
}
void updateP(int node, int l, int r, int p, int q, ll val) {
prop(node, l == r);
if(r < p or q < l) return;
if(p <= l and r <= q) {
lazyP[node] = val;
prop(node, l == r);
return;
}
int mid = (l+r)/2;
updateP(2*node, l, mid, p, q, val);
updateP(2*node+1, mid+1, r, p, q, val);
segP[node] = min(segP[2*node], segP[2*node+1]);
}
void update(int node, int l, int r, int ind, ll val) {
seg[node] += val;
if(l == r) return;
int mid = (l+r)/2;
if(ind <= mid) update(2*node, l, mid, ind, val);
else update(2*node+1, mid+1, r, ind, val);
}
ll queryP(int node, int l, int r, int p, int q) { // min segP
prop(node, l == r);
if(q < l or r < p) return 1e18;
if(p <= l and r <= q) return segP[node];
int mid = (l+r)/2;
return min(queryP(2*node, l, mid, p, q), queryP(2*node+1, mid+1, r, p, q));
}
ll query(int node, int l, int r, int p, int q) { // sum seg
if(q < l or r < p) return 0;
if(p <= l and r <= q) return seg[node];
int mid = (l+r)/2;
return query(2*node, l, mid, p, q) + query(2*node+1, mid+1, r, p, q);
}
int query_busca(int node, int l, int r, ll val) {
if(l == r) return l;
int mid = (l+r)/2;
if(seg[2*node] >= val) return query_busca(2*node, l, mid, val);
else return query_busca(2*node+1, mid+1, r, val - seg[2*node]);
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> q;
vector<int> t(q), c(q), ans(q);
vector<ll> k(q);
for(int i = 0, l, r; i < q; i++) {
cin >> t[i];
if(t[i] == 1) cin >> l >> r >> c[i] >> k[i];
else if(t[i] == 2) cin >> l >> r >> k[i];
else cin >> l >> k[i];
if(t[i] == 3) Q[l].pb(i);
else ls[l].pb(i), ls[r+1].pb(-i-1);
}
for(int i = 1; i <= n; i++) {
for(auto it : ls[i]) {
int C = 1;
if(it < 0) it = -it-1, C = -1;
if(t[it] == 1) {
updateP(1, 0, q-1, it, q-1, C * k[it]);
update(1, 0, q-1, it, C * k[it]);
}
else updateP(1, 0, q-1, it, q-1, C * -k[it]);
}
for(auto t3 : Q[i]) {
ll minP = min(queryP(1, 0, q-1, 0, t3), 0LL);
ll tot1 = query(1, 0, q-1, 0, t3);
ll pref3 = queryP(1, 0, q-1, t3, t3);
int T = query_busca(1, 0, q-1, tot1 -pref3 + minP + k[t3]);
if(T >= t3) ans[t3] = 0;
else ans[t3] = c[T];
}
}
for(int i = 0; i < q; i++)
if(t[i] == 3) cout << ans[i] << "\n";
}
# | 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... |