#include <bits/stdc++.h>
#define se second
#define fs first
#define pb push_back
#define ll long long
#define ii pair<ll,ll>
#define ld long double
#define SZ(v) (int)v.size()
#define ALL(v) v.begin(), v.end()
#define bit(msk, i) ((msk >> i) & 1)
#define iter(id, v) for(auto id : v)
#define rep(i,m,n) for(int i=(m); i<=(n); i++)
#define reb(i,m,n) for(int i=(m); i>=(n); i--)
using namespace std;
mt19937_64 rd(chrono :: steady_clock :: now().time_since_epoch().count());
ll Rand(ll l, ll r) { return uniform_int_distribution<ll> (l, r)(rd); }
const int N = 5e5 + 7;
const ll Mod = 1e9 + 7;
const int szBL = 916;
const ll INF = 1e18 + 7;
const int BASE = 137;
struct Data3 {
ll idx, pos, id;
};
int n, m, Q;
int a[N];
int color[N];
vector<pair<int,int>> q1[N];
vector<Data3> q3[N];
struct Segment_Tree_Beats {
int Range;
struct Node {
ll lz, mn1, mn2, mnc, sum;
Node (ll lz = 0, ll mn1 = 0, ll mn2 = INF, ll mnc = 0, ll sum = 0) : lz(lz), mn1(mn1), mn2(mn2), mnc(mnc), sum(sum) {};
};
Node st[N << 2];
void init (int n) {
Range = n;
}
void Merge (Node &cur, Node &left, Node &right){
cur.sum = left.sum + right.sum;
if (left.mn1 <= right.mn1) {
cur.mn1 = left.mn1, cur.mnc = left.mnc;
if (left.mn1 == right.mn1) cur.mnc += right.mnc, cur.mn2 = min(left.mn2, right.mn2);
else cur.mn2 = min(left.mn2, right.mn1);
}
else {
cur.mn1 = right.mn1, cur.mnc = right.mnc;
cur.mn2 = min(left.mn1, right.mn2);
}
}
void build (int id, int l, int r) {
if (l == r) {
st[id].mn1 = 0;
st[id].mn2 = INF;
st[id].mnc = 1;
st[id].sum = 0;
return;
}
int mid = l + r >> 1;
build (id << 1, l, mid);
build (id << 1 | 1, mid + 1, r);
Merge (st[id], st[id << 1], st[id << 1 | 1]);
}
void down (int id, int l, int r) {
int mid = l + r >> 1;
int left = (id << 1), right = (id << 1 | 1);
st[left].sum += st[id].lz * (mid - l + 1);
st[right].sum += st[id].lz * (r - mid);
rep (i, left, right) {
st[i].mn1 += st[id].lz;
st[i].lz += st[id].lz;
if (st[i].mn1 < st[id].mn1) {
st[i].sum += 1LL * (st[id].mn1 - st[i].mn1) * st[i].mnc;
st[i].mn1 = st[id].mn1;
}
if (st[i].mn2 != INF) st[i].mn2 += st[id].lz;
}
st[id].lz = 0;
}
void update1 (int id, int l, int r, int u, int v, ll val) {
if (l > v || r < u) return;
if (l >= u && r <= v) {
st[id].sum += 1LL * (r - l + 1) * val;
st[id].lz += val;
st[id].mn1 += val;
if(st[id].mn2 != INF) st[id].mn2 += val;
return;
}
int mid = l + r >> 1;
down (id, l, r);
update1 (id << 1, l, mid, u, v, val);
update1 (id << 1 | 1, mid + 1, r, u, v, val);
Merge (st[id], st[id << 1], st[id << 1 | 1]);
}
void update2 (int id, int l, int r, int u, int v, ll val) {
if (l > v || r < u || st[id].mn1 >= val) return;
if (l >= u && r <= v && st[id].mn2 > val) {
st[id].sum += 1LL * (val - st[id].mn1) * st[id].mnc;
st[id].mn1 = val;
// cout << id <<" "<<l<<" "<<r<<" "<<st[id].sum<<" "<<st[id].mn1<<" "<<st[id].mnc<<"hihih\n";
return;
}
int mid = l + r >> 1;
down (id, l, r);
update2 (id << 1, l, mid, u, v, val);
update2 (id << 1 | 1, mid + 1, r, u, v, val);
Merge (st[id], st[id << 1], st[id << 1 | 1]);
}
ll get (int id, int l, int r, int u, int v) {
if (l > v || r < u) return 0;
if (l >= u && r <= v)
return st[id].sum;
int mid = l + r >> 1;
down(id, l, r);
return get (id << 1, l, mid, u, v) + get (id << 1 | 1, mid + 1, r, u, v);
}
void update1 (int u, int v, ll val) {
update1 (1, 1, Range, u, v, val);
}
void update2 (int u, int v, ll val) {
update2 (1, 1, Range, u, v, val);
}
ll get (int u, int v) {
return get (1, 1, Range, u, v);
}
}ST, Tot;
struct Fenwick_Tree {
int Range;
ll fen[N];
void init (int n) { Range = n; }
void update (int pos, ll val) {
for (; pos <= Range; pos += pos & -pos) fen[pos] += val;
}
ll get (int pos) {
ll res = 0;
for (; pos > 0; pos -= pos & -pos) res += fen[pos];
return res;
}
}BIT;
void solution() {
cin >> n >> m >> Q;
ST.init(n);
ST.build(1, 1, n);
Tot.init(n);
int numq3 = 0;
// ST.update1 (3, 3, 2);
// ST.update1 (3, 3, -3);
// ST.update2 (3, 3, 0);
// ST.update1 (3, 3, 2);
// cout << ST.get (3, 3) <<"\n";
// return;
rep (i, 1, Q) {
int typ;
cin >> typ;
if (typ == 1) {
ll L, R, C, K;
cin >> L >> R >> C >> K;
color[i] = C;
q1[L].push_back({K, i});
q1[R + 1].push_back({-K, i});
ST.update1 (L, R, K);
Tot.update1 (L, R, K);
}
else if (typ == 2) {
ll L, R, K;
cin >> L >> R >> K;
ST.update1 (L, R, -K);
ST.update2 (L, R, 0);
// cout <<i<<" typ2 :"<<ST.get(3, 3)<<"\n";
}
else {
int pos, X;
cin >> pos >> X;
int idx = Tot.get (pos, pos) - ST.get (pos, pos) + X;
// cout << i<<": "<<idx<<" "<<Tot.get (pos, pos)<<" "<<ST.get (pos, pos) <<"\n";
q3[pos].push_back({idx, numq3++, i});
}
}
vector<int> Ans(numq3);
BIT.init(Q + 1);
rep (i, 1, n) {
iter (&id, q1[i]) {
BIT.update (id.se, id.fs);
}
iter (&id, q3[i]) {
int pos; {
int lf = 1, rt = id.id;
while (lf < rt) {
int mid = lf + rt >> 1;
if (BIT.get(mid) >= id.idx) rt = mid;
else lf = mid + 1;
}
pos = lf;
}
// cout << id.id<<":"<<pos<<" "<<BIT.get(pos) <<"\n";
if (BIT.get (pos) >= id.idx) Ans[id.pos] = color[pos];
else Ans[id.pos] = 0;
}
}
iter (&id, Ans) cout << id <<"\n";
}
#define file(name) freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout);
int main () {
// file("c");
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
ll num_Test = 1;
// cin >> num_Test;
while(num_Test--)
solution();
}
/*
18 3
2 5
6 21
13 19
9 17
14 17
19 20
2 16
2 10
9 14
19 20
14 16
1 3
17 19
14 21
18 19
4 7
5 12
1 13
*/
Compilation message
foodcourt.cpp: In member function 'void Segment_Tree_Beats::build(int, int, int)':
foodcourt.cpp:69:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
69 | int mid = l + r >> 1;
| ~~^~~
foodcourt.cpp: In member function 'void Segment_Tree_Beats::down(int, int, int)':
foodcourt.cpp:75:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
75 | int mid = l + r >> 1;
| ~~^~~
foodcourt.cpp: In member function 'void Segment_Tree_Beats::update1(int, int, int, int, int, long long int)':
foodcourt.cpp:100:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
100 | int mid = l + r >> 1;
| ~~^~~
foodcourt.cpp: In member function 'void Segment_Tree_Beats::update2(int, int, int, int, int, long long int)':
foodcourt.cpp:115:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
115 | int mid = l + r >> 1;
| ~~^~~
foodcourt.cpp: In member function 'long long int Segment_Tree_Beats::get(int, int, int, int, int)':
foodcourt.cpp:126:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
126 | int mid = l + r >> 1;
| ~~^~~
foodcourt.cpp: In function 'void solution()':
foodcourt.cpp:205:34: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
205 | int mid = lf + rt >> 1;
| ~~~^~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
32 ms |
183388 KB |
Output is correct |
2 |
Correct |
31 ms |
183252 KB |
Output is correct |
3 |
Correct |
32 ms |
183132 KB |
Output is correct |
4 |
Correct |
32 ms |
183024 KB |
Output is correct |
5 |
Correct |
33 ms |
183120 KB |
Output is correct |
6 |
Correct |
30 ms |
183124 KB |
Output is correct |
7 |
Correct |
31 ms |
183072 KB |
Output is correct |
8 |
Correct |
33 ms |
183132 KB |
Output is correct |
9 |
Correct |
32 ms |
183124 KB |
Output is correct |
10 |
Correct |
31 ms |
183124 KB |
Output is correct |
11 |
Correct |
32 ms |
183120 KB |
Output is correct |
12 |
Correct |
32 ms |
183044 KB |
Output is correct |
13 |
Correct |
30 ms |
182980 KB |
Output is correct |
14 |
Correct |
31 ms |
183132 KB |
Output is correct |
15 |
Correct |
31 ms |
183128 KB |
Output is correct |
16 |
Correct |
34 ms |
183132 KB |
Output is correct |
17 |
Correct |
32 ms |
183120 KB |
Output is correct |
18 |
Correct |
31 ms |
183132 KB |
Output is correct |
19 |
Correct |
31 ms |
182952 KB |
Output is correct |
20 |
Correct |
32 ms |
183132 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
32 ms |
183388 KB |
Output is correct |
2 |
Correct |
31 ms |
183252 KB |
Output is correct |
3 |
Correct |
32 ms |
183132 KB |
Output is correct |
4 |
Correct |
32 ms |
183024 KB |
Output is correct |
5 |
Correct |
33 ms |
183120 KB |
Output is correct |
6 |
Correct |
30 ms |
183124 KB |
Output is correct |
7 |
Correct |
31 ms |
183072 KB |
Output is correct |
8 |
Correct |
33 ms |
183132 KB |
Output is correct |
9 |
Correct |
32 ms |
183124 KB |
Output is correct |
10 |
Correct |
31 ms |
183124 KB |
Output is correct |
11 |
Correct |
32 ms |
183120 KB |
Output is correct |
12 |
Correct |
32 ms |
183044 KB |
Output is correct |
13 |
Correct |
30 ms |
182980 KB |
Output is correct |
14 |
Correct |
31 ms |
183132 KB |
Output is correct |
15 |
Correct |
31 ms |
183128 KB |
Output is correct |
16 |
Correct |
34 ms |
183132 KB |
Output is correct |
17 |
Correct |
32 ms |
183120 KB |
Output is correct |
18 |
Correct |
31 ms |
183132 KB |
Output is correct |
19 |
Correct |
31 ms |
182952 KB |
Output is correct |
20 |
Correct |
32 ms |
183132 KB |
Output is correct |
21 |
Incorrect |
30 ms |
183068 KB |
Output isn't correct |
22 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
151 ms |
187020 KB |
Output is correct |
2 |
Correct |
134 ms |
187212 KB |
Output is correct |
3 |
Correct |
139 ms |
185168 KB |
Output is correct |
4 |
Correct |
149 ms |
186960 KB |
Output is correct |
5 |
Correct |
136 ms |
187216 KB |
Output is correct |
6 |
Correct |
136 ms |
187088 KB |
Output is correct |
7 |
Correct |
47 ms |
186192 KB |
Output is correct |
8 |
Correct |
49 ms |
186504 KB |
Output is correct |
9 |
Correct |
138 ms |
187044 KB |
Output is correct |
10 |
Correct |
131 ms |
186960 KB |
Output is correct |
11 |
Correct |
140 ms |
186952 KB |
Output is correct |
12 |
Correct |
137 ms |
186960 KB |
Output is correct |
13 |
Correct |
127 ms |
186964 KB |
Output is correct |
14 |
Correct |
135 ms |
187476 KB |
Output is correct |
15 |
Correct |
131 ms |
187388 KB |
Output is correct |
16 |
Correct |
152 ms |
187472 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
141 ms |
191856 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
32 ms |
183388 KB |
Output is correct |
2 |
Correct |
31 ms |
183252 KB |
Output is correct |
3 |
Correct |
32 ms |
183132 KB |
Output is correct |
4 |
Correct |
32 ms |
183024 KB |
Output is correct |
5 |
Correct |
33 ms |
183120 KB |
Output is correct |
6 |
Correct |
30 ms |
183124 KB |
Output is correct |
7 |
Correct |
31 ms |
183072 KB |
Output is correct |
8 |
Correct |
33 ms |
183132 KB |
Output is correct |
9 |
Correct |
32 ms |
183124 KB |
Output is correct |
10 |
Correct |
31 ms |
183124 KB |
Output is correct |
11 |
Correct |
32 ms |
183120 KB |
Output is correct |
12 |
Correct |
32 ms |
183044 KB |
Output is correct |
13 |
Correct |
30 ms |
182980 KB |
Output is correct |
14 |
Correct |
31 ms |
183132 KB |
Output is correct |
15 |
Correct |
31 ms |
183128 KB |
Output is correct |
16 |
Correct |
34 ms |
183132 KB |
Output is correct |
17 |
Correct |
32 ms |
183120 KB |
Output is correct |
18 |
Correct |
31 ms |
183132 KB |
Output is correct |
19 |
Correct |
31 ms |
182952 KB |
Output is correct |
20 |
Correct |
32 ms |
183132 KB |
Output is correct |
21 |
Correct |
151 ms |
187020 KB |
Output is correct |
22 |
Correct |
134 ms |
187212 KB |
Output is correct |
23 |
Correct |
139 ms |
185168 KB |
Output is correct |
24 |
Correct |
149 ms |
186960 KB |
Output is correct |
25 |
Correct |
136 ms |
187216 KB |
Output is correct |
26 |
Correct |
136 ms |
187088 KB |
Output is correct |
27 |
Correct |
47 ms |
186192 KB |
Output is correct |
28 |
Correct |
49 ms |
186504 KB |
Output is correct |
29 |
Correct |
138 ms |
187044 KB |
Output is correct |
30 |
Correct |
131 ms |
186960 KB |
Output is correct |
31 |
Correct |
140 ms |
186952 KB |
Output is correct |
32 |
Correct |
137 ms |
186960 KB |
Output is correct |
33 |
Correct |
127 ms |
186964 KB |
Output is correct |
34 |
Correct |
135 ms |
187476 KB |
Output is correct |
35 |
Correct |
131 ms |
187388 KB |
Output is correct |
36 |
Correct |
152 ms |
187472 KB |
Output is correct |
37 |
Correct |
129 ms |
186960 KB |
Output is correct |
38 |
Correct |
114 ms |
186800 KB |
Output is correct |
39 |
Correct |
45 ms |
186252 KB |
Output is correct |
40 |
Correct |
47 ms |
186252 KB |
Output is correct |
41 |
Correct |
153 ms |
186872 KB |
Output is correct |
42 |
Correct |
134 ms |
186964 KB |
Output is correct |
43 |
Correct |
141 ms |
187060 KB |
Output is correct |
44 |
Correct |
130 ms |
186960 KB |
Output is correct |
45 |
Correct |
149 ms |
186948 KB |
Output is correct |
46 |
Correct |
138 ms |
186956 KB |
Output is correct |
47 |
Correct |
66 ms |
186316 KB |
Output is correct |
48 |
Correct |
121 ms |
186524 KB |
Output is correct |
49 |
Correct |
111 ms |
186452 KB |
Output is correct |
50 |
Correct |
134 ms |
186708 KB |
Output is correct |
51 |
Correct |
158 ms |
186884 KB |
Output is correct |
52 |
Correct |
156 ms |
187032 KB |
Output is correct |
53 |
Correct |
115 ms |
186964 KB |
Output is correct |
54 |
Correct |
148 ms |
187452 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
57 ms |
187080 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
32 ms |
183388 KB |
Output is correct |
2 |
Correct |
31 ms |
183252 KB |
Output is correct |
3 |
Correct |
32 ms |
183132 KB |
Output is correct |
4 |
Correct |
32 ms |
183024 KB |
Output is correct |
5 |
Correct |
33 ms |
183120 KB |
Output is correct |
6 |
Correct |
30 ms |
183124 KB |
Output is correct |
7 |
Correct |
31 ms |
183072 KB |
Output is correct |
8 |
Correct |
33 ms |
183132 KB |
Output is correct |
9 |
Correct |
32 ms |
183124 KB |
Output is correct |
10 |
Correct |
31 ms |
183124 KB |
Output is correct |
11 |
Correct |
32 ms |
183120 KB |
Output is correct |
12 |
Correct |
32 ms |
183044 KB |
Output is correct |
13 |
Correct |
30 ms |
182980 KB |
Output is correct |
14 |
Correct |
31 ms |
183132 KB |
Output is correct |
15 |
Correct |
31 ms |
183128 KB |
Output is correct |
16 |
Correct |
34 ms |
183132 KB |
Output is correct |
17 |
Correct |
32 ms |
183120 KB |
Output is correct |
18 |
Correct |
31 ms |
183132 KB |
Output is correct |
19 |
Correct |
31 ms |
182952 KB |
Output is correct |
20 |
Correct |
32 ms |
183132 KB |
Output is correct |
21 |
Incorrect |
30 ms |
183068 KB |
Output isn't correct |
22 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
32 ms |
183388 KB |
Output is correct |
2 |
Correct |
31 ms |
183252 KB |
Output is correct |
3 |
Correct |
32 ms |
183132 KB |
Output is correct |
4 |
Correct |
32 ms |
183024 KB |
Output is correct |
5 |
Correct |
33 ms |
183120 KB |
Output is correct |
6 |
Correct |
30 ms |
183124 KB |
Output is correct |
7 |
Correct |
31 ms |
183072 KB |
Output is correct |
8 |
Correct |
33 ms |
183132 KB |
Output is correct |
9 |
Correct |
32 ms |
183124 KB |
Output is correct |
10 |
Correct |
31 ms |
183124 KB |
Output is correct |
11 |
Correct |
32 ms |
183120 KB |
Output is correct |
12 |
Correct |
32 ms |
183044 KB |
Output is correct |
13 |
Correct |
30 ms |
182980 KB |
Output is correct |
14 |
Correct |
31 ms |
183132 KB |
Output is correct |
15 |
Correct |
31 ms |
183128 KB |
Output is correct |
16 |
Correct |
34 ms |
183132 KB |
Output is correct |
17 |
Correct |
32 ms |
183120 KB |
Output is correct |
18 |
Correct |
31 ms |
183132 KB |
Output is correct |
19 |
Correct |
31 ms |
182952 KB |
Output is correct |
20 |
Correct |
32 ms |
183132 KB |
Output is correct |
21 |
Incorrect |
30 ms |
183068 KB |
Output isn't correct |
22 |
Halted |
0 ms |
0 KB |
- |