Skip to content

Commit ad29eb4

Browse files
committed
Finish range queries + refactor
1 parent 75adbf7 commit ad29eb4

13 files changed

+330
-105
lines changed

range-queries/2-salary-queries.cpp

Lines changed: 0 additions & 105 deletions
This file was deleted.

range-queries/2rmq.cpp renamed to range-queries/dynamic-range-minimum-queries.cpp

File renamed without changes.

range-queries/2rsq.cpp renamed to range-queries/dynamic-range-sum-queries.cpp

File renamed without changes.
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#include <bits/stdc++.h>
2+
#define debug(...) fprintf(stderr, __VA_ARGS__)
3+
using namespace std;
4+
using ll = long long;
5+
6+
const int maxn = 2e5+5, inf = 1e9+7;
7+
int n, q, a[maxn], lazy[maxn<<2];
8+
ll st[maxn<<2], pre[maxn], ans[maxn];
9+
10+
void push(int pos, int l, int r) {
11+
if (!lazy[pos]) return;
12+
st[pos] = 1ll * lazy[pos] * (r-l+1);
13+
if (l < r) lazy[pos<<1] = lazy[pos<<1|1] = lazy[pos];
14+
lazy[pos] = 0;
15+
}
16+
17+
void upd(int ql, int qr, int v, int pos = 1, int l = 1, int r = n) {
18+
push(pos, l, r);
19+
if (r < ql or l > qr) return;
20+
if (ql <= l && r <= qr) {
21+
lazy[pos] = v;
22+
push(pos, l, r);
23+
return;
24+
}
25+
int mid = (l+r) >> 1, child = pos<<1;
26+
upd(ql, qr, v, child, l, mid);
27+
upd(ql, qr, v, child|1, mid+1, r);
28+
st[pos] = st[child] + st[child|1];
29+
}
30+
31+
ll query(int ql, int qr, int pos = 1, int l = 1, int r = n) {
32+
push(pos, l, r);
33+
if (r < ql or l > qr) return 0;
34+
if (ql <= l && r <= qr) return st[pos];
35+
int mid = (l+r) >> 1, child = pos<<1;
36+
return query(ql, qr, child, l, mid) + query(ql, qr, child|1, mid+1, r);
37+
}
38+
39+
vector<pair<int,pair<int,int>>> stk;
40+
vector<pair<int,int>> qs[maxn];
41+
42+
int main(){
43+
scanf("%d %d", &n, &q);
44+
for(int i = 1; i<=n; i++) {
45+
scanf("%d", &a[i]),
46+
pre[i] = pre[i-1] + a[i];
47+
}
48+
for(int i = 0, l, r; i<q; i++) {
49+
scanf("%d %d", &l, &r);
50+
qs[l].emplace_back(r, i);
51+
}
52+
stk.emplace_back(inf, make_pair(n+1, n+1));
53+
for(int i = n, r; i > 0; --i) {
54+
r = i;
55+
while (stk.back().first < a[i]) {
56+
r = stk.back().second.second;
57+
stk.pop_back();
58+
}
59+
stk.emplace_back(a[i], make_pair(i, r));
60+
upd(i, r, a[i]);
61+
for(auto &p: qs[i]) ans[p.second] = query(i, p.first) - pre[p.first] + pre[i-1];
62+
}
63+
for(int i = 0; i<q; i++) printf("%lld\n", ans[i]);
64+
return 0;
65+
}
66+

range-queries/pizzeria-queries.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include <bits/stdc++.h>
2+
#define debug(...) fprintf(stderr, __VA_ARGS__)
3+
using namespace std;
4+
using ll = long long;
5+
6+
const int maxn = 2e5+5, inf = 2e9;
7+
int n, q, a[maxn], st[2][4*maxn];
8+
9+
void build(int id, int pos = 1, int l = 1, int r = n) {
10+
if (l == r) {
11+
st[id][pos] = a[l] + (id == 0 ? -l : l);
12+
return;
13+
}
14+
int mid = (l+r) >> 1;
15+
build(id, pos<<1, l, mid);
16+
build(id, pos<<1|1, mid+1, r);
17+
st[id][pos] = min(st[id][pos<<1], st[id][pos<<1|1]);
18+
}
19+
20+
void upd(int id, int i, int v, int pos = 1, int l = 1, int r = n) {
21+
if (l == r) { st[id][pos] = v; return; }
22+
int mid = (l+r) >> 1, child = pos << 1;
23+
if (i <= mid) upd(id, i, v, child, l, mid);
24+
else upd(id, i, v, child|1, mid+1, r);
25+
st[id][pos] = min(st[id][child], st[id][child|1]);
26+
}
27+
28+
int query(int id, int ql, int qr, int pos = 1, int l = 1, int r = n) {
29+
if (r < l or r < ql or l > qr) return inf;
30+
if (ql <= l && r <= qr) return st[id][pos];
31+
int mid = (l+r) >> 1, child = pos << 1;
32+
return min(query(id, ql, qr, child, l ,mid), query(id, ql, qr, child|1, mid+1, r));
33+
}
34+
35+
int main(){
36+
scanf("%d %d", &n, &q);
37+
for(int i = 1; i<=n; i++) scanf("%d", &a[i]);
38+
build(0);
39+
build(1);
40+
for(int t, k; q--; ) {
41+
scanf("%d %d", &t, &k);
42+
if (t == 1) scanf("%d", &a[k]), upd(0, k, a[k]-k), upd(1, k, a[k]+k);
43+
else printf("%d\n", min(query(0, 1, k) + k, query(1, k, n) - k));
44+
}
45+
46+
return 0;
47+
}
48+
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#include <bits/stdc++.h>
2+
#define debug(...) fprintf(stderr, __VA_ARGS__)
3+
using namespace std;
4+
using ll = long long;
5+
6+
const int maxn = 2e5+5;
7+
8+
int n, q, a[maxn];
9+
10+
struct node {
11+
ll sum;
12+
ll l_a, l_k;
13+
explicit node(ll v = 0) : sum(v), l_a(0), l_k(0) {}
14+
void pull(const node &par, int l, int parl) {
15+
l_a += par.l_a + par.l_k * (l-parl);
16+
l_k += par.l_k;
17+
}
18+
} st[4*maxn];
19+
20+
void build(int pos = 1, int l = 1, int r = n) {
21+
if (l == r) { st[pos].sum = a[l]; return; }
22+
int mid = (l+r) >> 1, child = pos << 1;
23+
build(child, l, mid);
24+
build(child|1, mid+1, r);
25+
st[pos].sum = st[child].sum + st[child|1].sum;
26+
}
27+
28+
void push(int pos, int l, int r) {
29+
node &cur = st[pos];
30+
if (cur.l_a == 0 && cur.l_k == 0) return;
31+
cur.sum += cur.l_a * (r-l+1);
32+
cur.sum += cur.l_k * ((1ll * (r-l) * (r-l+1)) >> 1);
33+
if (l < r) {
34+
int child = pos << 1, mid = (l+r) >> 1;
35+
st[child].pull(cur, l, l);
36+
st[child|1].pull(cur, mid+1, l);
37+
}
38+
cur.l_a = cur.l_k = 0;
39+
}
40+
41+
void upd(int ql, int qr, int pos = 1, int l = 1, int r = n) {
42+
push(pos, l, r);
43+
if (r < ql or l > qr) return;
44+
if (ql <= l && r <= qr) {
45+
st[pos].l_a += l-ql+1;
46+
st[pos].l_k += 1;
47+
push(pos, l, r);
48+
return;
49+
}
50+
int mid = (l+r) >> 1, child = pos << 1;
51+
upd(ql, qr, child, l, mid);
52+
upd(ql, qr, child|1, mid+1, r);
53+
st[pos].sum = st[child].sum + st[child|1].sum;
54+
}
55+
56+
ll query(int ql, int qr, int pos = 1, int l = 1, int r = n) {
57+
push(pos, l, r);
58+
if (r < ql or l > qr) return 0;
59+
if (ql <= l && r <= qr) return st[pos].sum;
60+
int mid = (l+r) >> 1, child = pos << 1;
61+
return query(ql, qr, child, l, mid) + query(ql, qr, child|1, mid+1, r);
62+
}
63+
64+
int main(){
65+
scanf("%d %d", &n, &q);
66+
for(int i = 1; i<=n; i++) scanf("%d", &a[i]);
67+
build();
68+
for(int t, l, r; q--; ) {
69+
scanf("%d %d %d", &t, &l, &r);
70+
if (t == 1) upd(l, r);
71+
else printf("%lld\n", query(l, r));
72+
}
73+
return 0;
74+
}
75+
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#include <bits/stdc++.h>
2+
#define debug(...) fprintf(stderr, __VA_ARGS__)
3+
using namespace std;
4+
using ll = long long;
5+
6+
const int maxn = 2e5+5;
7+
const ll inf = 1e18;
8+
int n, q, a[maxn];
9+
ll pre[maxn], st[maxn*4], lazy[maxn*4];
10+
11+
void build(int pos = 1, int l = 1, int r = n) {
12+
if (l == r) { st[pos] = pre[l]; return; }
13+
int mid = (l+r) >> 1, child = pos<<1;
14+
build(child, l, mid);
15+
build(child|1, mid+1, r);
16+
st[pos] = max(st[child], st[child|1]);
17+
}
18+
19+
void push(int pos, int l, int r) {
20+
if (lazy[pos] == 0) return;
21+
st[pos] += lazy[pos];
22+
if (l < r) lazy[pos<<1] += lazy[pos], lazy[(pos<<1)|1] += lazy[pos];
23+
lazy[pos] = 0;
24+
}
25+
26+
void updr(int ql, int qr, ll v, int pos = 1, int l = 1, int r = n) {
27+
push(pos, l, r);
28+
if (r < ql or l > qr) return;
29+
if (ql <= l && r <= qr) {
30+
lazy[pos] += v;
31+
push(pos, l, r);
32+
return;
33+
}
34+
int mid = (l+r) >> 1, child = pos << 1;
35+
updr(ql, qr, v, child, l, mid);
36+
updr(ql, qr, v, child|1, mid+1, r);
37+
st[pos] = max(st[child], st[child|1]);
38+
}
39+
40+
ll qmax(int ql, int qr, int pos = 1, int l = 1, int r = n) {
41+
push(pos, l, r);
42+
if (qr < 1) return 0ll;
43+
if (r < ql or l > qr) return -inf;
44+
if (ql <= l && r <= qr) return st[pos];
45+
int mid = (l+r) >> 1, child = pos<<1;
46+
return max(qmax(ql, qr, child, l, mid), qmax(ql, qr, child|1, mid+1, r));
47+
}
48+
49+
int main(){
50+
scanf("%d %d", &n, &q);
51+
for(int i = 1; i<=n; i++) {
52+
scanf("%d", &a[i]);
53+
pre[i] = pre[i-1] + a[i];
54+
}
55+
build();
56+
for(int t, k, u; q--; ) {
57+
scanf("%d %d %d", &t, &k, &u);
58+
if (t == 1) {
59+
updr(k, n, ll(u) - a[k]);
60+
a[k] = u;
61+
} else printf("%lld\n", max(qmax(k, u) - qmax(k-1, k-1), 0ll));
62+
}
63+
64+
return 0;
65+
}
66+

0 commit comments

Comments
 (0)