#include <iostream>
#include <vector>
#include <algorithm>
#define f first
#define s second
#define int long long
using namespace std;
int n, m, q, c[250010];
vector<pair<pair<int,int>,int>> query[250010], op[250010];
vector<int> ans;
struct {
struct {
pair<int,int> minn;
int lz;
} node[1000010];
void build(int id, int x, int y) {
if (x == y) {
node[id].minn = {0,x};
return;
}
int mid = (x+y)/2;
build(id*2,x,mid);
build(id*2+1,mid+1,y);
node[id].minn = min(node[id*2].minn,node[id*2+1].minn);
}
void split(int id) {
node[id*2].minn.f += node[id].lz;
node[id*2+1].minn.f += node[id].lz;
node[id*2].lz += node[id].lz;
node[id*2+1].lz += node[id].lz;
node[id].lz = 0;
}
void update(int id, int x, int y, int pos, int val) {
if (pos <= x) {
node[id].minn.f += val;
node[id].lz += val;
return;
}
if (y < pos) return;
int mid = (x+y)/2;
split(id);
update(id*2,x,mid,pos,val);
update(id*2+1,mid+1,y,pos,val);
node[id].minn = min(node[id*2].minn,node[id*2+1].minn);
}
pair<int,int> find(int id, int x, int y, int l, int r) {
if ((l <= x) && (y <= r)) return node[id].minn;
if ((y < l) || (r < x)) return {1e18,1e18};
int mid = (x+y)/2;
split(id);
return min(find(id*2,x,mid,l,r),find(id*2+1,mid+1,y,l,r));
}
} seg;
struct {
long long node[1000010], sum;
void update(int id, int x, int y, int pos, int val) {
if (x == y) {
node[id] += val;
return;
}
int mid = (x+y)/2;
if (pos <= mid) update(id*2,x,mid,pos,val);
else update(id*2+1,mid+1,y,pos,val);
node[id] = node[id*2]+node[id*2+1];
}
int find(int id, int x, int y, int l, int r) {
if ((l <= x) && (y <= r)) return node[id];
if ((y < l) || (r < x)) return 0;
int mid = (x+y)/2;
return find(id*2,x,mid,l,r)+find(id*2+1,mid+1,y,l,r);
}
int findpos(int id, int x, int y, int l, int r, int val) {
if ((y < l) || (r < x)) return -1;
if ((l <= x) && (y <= r)) {
if (sum+node[id] < val) {
sum += node[id];
return -1;
}
}
if (x == y) return c[x];
int mid = (x+y)/2, tmp = findpos(id*2,x,mid,l,r,val);
if (tmp == -1) return findpos(id*2+1,mid+1,y,l,r,val);
else return tmp;
}
} seg1, seg2;
signed main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m >> q;
for (int i = 1; i <= q; i++) {
int type, l, r, k;
cin >> type;
if (type == 1) {
cin >> l >> r >> c[i] >> k;
op[l].push_back({{k,c[i]},i});
op[r+1].push_back({{-k,c[i]},i});
} else if (type == 2) {
cin >> l >> r >> k;
op[l].push_back({{-k,0},i});
op[r+1].push_back({{k,0},i});
} else {
cin >> l >> k;
query[l].push_back({{k,i},ans.size()});
ans.push_back(0);
}
}
seg.build(1,0,q);
for (int i = 1; i <= n; i++) {
for (int j = 0; j < op[i].size(); j++) {
seg.update(1,0,q,op[i][j].s,op[i][j].f.f);
if (op[i][j].f.s == 0) seg1.update(1,0,q,op[i][j].s,-op[i][j].f.f);
else seg2.update(1,0,q,op[i][j].s,op[i][j].f.f);
}
for (int j = 0; j < query[i].size(); j++) {
int pos = query[i][j].f.s;
pair<int,int> tmp = seg.find(1,0,q,0,pos);
if (seg.find(1,0,q,pos,pos).f-tmp.f < query[i][j].f.f) {
ans[query[i][j].s] = 0;
continue;
}
int val = seg1.find(1,0,q,tmp.s+1,pos)+query[i][j].f.f;
seg2.sum = 0;
ans[query[i][j].s] = seg2.findpos(1,0,q,tmp.s+1,pos,val);
}
}
for (int i = 0; i < ans.size(); i++) 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... |