提出 #70624008
ソースコード 拡げる
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#ifdef jlocal
#include<jdebug/debug.hpp>
#else
#define debug(...) 0;
#endif
using namespace __gnu_pbds;
using namespace std;
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int,int> pii;
typedef vector<pii> vii;
template <typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#if defined(__LP64__) || defined(_WIN64)
typedef __int128 lll;
#else
typedef long long lll;
#endif
#define pcount(x) __builtin_popcount(x)
#define pcountll(x) __builtin_popcountll(x)
#define all(x) x.begin(),x.end()
const ld pi = 3.14159265358979323846L;
const ld sqrt2 = 1.41421356237309504880L;
template<class T>
istream& operator>>(istream& in, vector<T> &a){
for (int i = 0; i < a.size(); i ++)
in >> a[i];
return in;
}
template<class T>
ostream& operator<<(ostream& out, vector<T> &a){
for (int i = 0; i < a.size(); i ++){
if (i > 0) out << ' ';
out << a[i];
}
return out;
}
#if defined(__LP64__) || defined(_WIN64)
istream& operator>>(istream& in, __int128 &x){
string S;
in >> S;
for (char &y : S){
x *= 10;
x += (y - '0');
}
return in;
}
ostream& operator<<(ostream& out, __int128 &x){
string s;
while(x > 0){
s.push_back((x % 10) + '0');
x /= 10;
}
if (s.size() == 0)
s.push_back('0');
reverse(all(s));
return out << s;
}
#endif
mt19937_64 MT64;
void pre_init() {
MT64 = mt19937_64(chrono::system_clock::now().
time_since_epoch().count());
}
template<
class T1, // answer value stored on nodes
class T2, // lazy update value stored on nodes
T1 merge(T1, T1),
void pushUpd(T2& /*padre*/, T2& /*hijo*/, int, int, int, int), // push update value from a node to another. parent -> child
void applyUpd(T2&, T1&, int, int) // apply the update value of a node to its answer value. upd -> ans
>
struct SegmentTreeLazy{
vector<T1> ST;
vector<T2> lazy;
vector<bool> upd;
int n;
void build(int i, int l, int r, vector<T1>&values){
if (l == r){
ST[i] = values[l];
return;
}
build(i << 1, l, (l + r) >> 1, values);
build(i << 1 | 1, (l + r) / 2 + 1, r, values);
ST[i] = merge(ST[i << 1], ST[i << 1 | 1]);
}
SegmentTreeLazy(vector<T1>&values){
n = values.size();
ST.resize(n << 2 | 3);
lazy.resize(n << 2 | 3);
upd.resize(n << 2 | 3, false);
build(1, 0, n - 1, values);
}
SegmentTreeLazy(int n, T1 x) : n(n){
vector<T1> v(n, x);
ST.resize(n << 2 | 3);
upd.resize(n << 2 | 3, false);
lazy.resize(n << 2 | 3);
build(1, 0, n - 1, v);
}
SegmentTreeLazy(){}
void push(int i, int l, int r){
if (upd[i]){
applyUpd(lazy[i], ST[i], l, r);
if (l != r){
pushUpd(lazy[i], lazy[i << 1], l, r, l, (l + r) / 2);
pushUpd(lazy[i], lazy[i << 1 | 1], l, r, (l + r) / 2 + 1, r);
upd[i << 1] = 1;
upd[i << 1 | 1] = 1;
}
lazy[i] = T2();
upd[i] = false;
}
}
void update(int i, int l, int r, int a, int b, T2 &u){
if (l >= a and r <= b){
pushUpd(u, lazy[i], a, b, l, r);
upd[i] = true;
}
push(i, l, r);
if (l > b or r < a) return;
if (l >= a and r <= b) return;
update(i << 1, l, (l + r) >> 1, a, b, u);
update(i << 1 | 1, (l + r) / 2 + 1, r, a, b, u);
ST[i] = merge(ST[i << 1], ST[i << 1 | 1]);
}
void update(int a, int b, T2 u){
if (a > b){
update(0, b, u);
update(a, n - 1, u);
return ;
}
update(1, 0, n - 1, a, b, u);
}
T1 query(int i, int l, int r, int a, int b){
push(i, l, r);
if (a <= l and r <= b)
return ST[i];
int mid = (l + r) >> 1;
if (mid < a)
return query(i << 1 | 1, mid + 1, r, a, b);
if (mid >= b)
return query(i << 1, l, mid, a, b);
return merge(query(i << 1, l, mid, a, b), query(i << 1 | 1, mid + 1, r, a, b));
}
T1 query(int a, int b){
if (a > b){
return merge(query(a, n - 1), query(0, b));
}
return query(1, 0, n - 1, a, b);
}
void get_leaves(int i, int l, int r, vector<T1> &res){
push(i, l, r);
if (l == r){
res[l] = ST[i];
return;
}
get_leaves(i << 1, l, (l + r) / 2, res);
get_leaves(i << 1 | 1, (l + r) / 2 + 1, r, res);
}
void get_leaves(vector<T1> &res) {
res.resize(n);
get_leaves(1, 0, n - 1, res);
}
};
template<class T>
T merge(T a, T b){
if (a.first == b.first){
return {a.first, a.second + b.second};
}
return max(a, b);
}
template<class U>
void pushUpd(U &u1, U &u2, int l1, int r1, int l2, int r2){
u2 += u1;
}
template<class T, class U>
void applyUpd(U &u, T &v, int l, int r){
v.first += u;
}
void solve(int caso){
int n, q;
cin >> n >> q;
vector<set<tuple<int, int, int>>> intervalos(60);
for (int i = 0; i < 60; i ++){
intervalos[i].insert({0, n - 1, 0});
}
SegmentTreeLazy<pii, int, merge<pii>, pushUpd<int>, applyUpd<pii, int>> stl(n, {0, 1});
for (int i = 0; i < q; i ++){
int t, l, r;
cin >> t >> l >> r;
l --; r --;
debug(t, l, r);
if (t == 3){
auto [a1, a2] = stl.query(l, r);
cout << a1 << " " << a2 << '\n';
}
else if (t == 1){
int x;
cin >> x;
x --;
auto it = intervalos[x].lower_bound({l, -1, -1});
if (it == intervalos[x].end() or get<0>(*it) > l)
it --;
vector<set<tuple<int, int, int>>::iterator> todel;
vector<tuple<int, int, int> > toadd;
int L = l, R = r;
debug(intervalos[x]);
debug(*it);
while(it != intervalos[x].end() and max(get<0>(*it), l) <= min(get<1>(*it), r)){
auto [left, right, b] = *it;
debug(left, right, b);
todel.push_back(it);
if (left < l and b == 0){
toadd.emplace_back(left, l - 1, b);
}
if (right > r and b == 0){
toadd.emplace_back(r + 1, right, b);
}
if (b == 0){
stl.update(max(L, left), min(R, right), 1);
}
if (left < l and b == 1){
L = left;
}
if (right > r and b == 1){
R = right;
}
it ++;
}
toadd.emplace_back(L, R, 1);
for (auto it : todel){
intervalos[x].erase(it);
}
for (auto X : toadd){
intervalos[x].insert(X);
}
debug(intervalos[x]);
}
else{
int x;
cin >> x;
x --;
auto it = intervalos[x].lower_bound({l, -1, -1});
if (it == intervalos[x].end() or get<0>(*it) > l)
it --;
vector<set<tuple<int, int, int>>::iterator> todel;
vector<tuple<int, int, int> > toadd;
int L = l, R = r;
while(it != intervalos[x].end() and max(get<0>(*it), l) <= min(get<1>(*it), r)){
auto [left, right, b] = *it;
todel.push_back(it);
if (left < l and b == 1){
toadd.emplace_back(left, l - 1, b);
}
if (right > r and b == 1){
toadd.emplace_back(r + 1, right, b);
}
if (b == 1){
stl.update(max(L, left), min(R, right), -1);
}
if (left < l and b == 0){
L = left;
}
if (right > r and b == 0){
R = right;
}
it ++;
}
toadd.emplace_back(L, R, 0);
for (auto it : todel){
intervalos[x].erase(it);
}
for (auto X : toadd){
intervalos[x].insert(X);
}
}
}
}
int main(){
#ifndef jlocal
ios::sync_with_stdio(0); cin.tie(0);
#endif
pre_init();
int t = 1;
for (int i = 1; i <= t; i ++){
solve(i);
}
return 0;
}
提出情報
コンパイルエラー
./Main.cpp: In function 'void solve(int)':
./Main.cpp:8:20: warning: statement has no effect [-Wunused-value]
8 | #define debug(...) 0;
| ^
./Main.cpp:216:17: note: in expansion of macro 'debug'
216 | debug(t, l, r);
| ^~~~~
./Main.cpp:8:20: warning: statement has no effect [-Wunused-value]
8 | #define debug(...) 0;
| ^
./Main.cpp:231:25: note: in expansion of macro 'debug'
231 | debug(intervalos[x]);
| ^~~~~
./Main.cpp:8:20: warning: statement has no effect [-Wunused-value]
8 | #define debug(...) 0;
| ^
./Main.cpp:232:25: note: in expansion of macro 'debug'
232 | debug(*it);
| ^~~~~
./Main.cpp:8:20: warning: statement has no effect [-Wunused-value]
8 | #define debug(...) 0;
| ^
./Main.cpp:235:33: note: in expansion of macro 'debug'
235 | debug(left, right, b);
| ^~~~~
./Main.cpp:8:20: warning: statement has no effect [-Wunused-value]
8 | #define debug(...) 0;
| ^
./Main.cpp:262:25: note: in expansion of macro 'debug'
262 | debug(intervalos[x]);
| ^~~~~
./Main.cpp:203:16: warning: unused parameter 'caso' [-Wunused-parameter]
203 | void solve(int caso){
| ~~~~^~~~
./Main.cpp: In instantiation of 'void pushUpd(U&, U&, int, int, int, int) [with U = int]':
./Main.cpp:210:71: required from here
210 | SegmentTreeLazy<pii, int, merge<pii>, pushUpd<int>, applyUpd<pii, int>> stl(n, {0, 1});
| ^~
./Main.cpp:192:32: warning: unused parameter 'l1' [-Wunused-parameter]
192 | void pushUpd(U &u1, U &u2, int l1, int r1, int l2, int r2){
| ~~~~^~
./Main.cpp:192:40: warning: unused parameter 'r1' [-Wunused-parameter]
192 | void pushUpd(U &u1, U &u2, int l1, int r1, int l2, int r2){
| ~~~~^~
./Main.cpp:192:48: warning: unused parameter 'l2' [-Wunused-parameter]
192 | void pushUpd(U &u1, U &u2, int l1, int r1, int l2, int r2){
| ~~~~^~
./Main.cpp:192:56: warning: unused parameter 'r2' [-Wunused-parameter]
192 | void pushUpd(U &u1, U &u2, int l1, int r1, int l2, int r2){
| ~~~~^~
./Main.cpp: In instantiation of 'void applyUpd(U&, T&, int, int) [with T = std::pair<int, int>; U = int]':
./Main.cpp:210:71: required from here
210 | SegmentTreeLazy<pii, int, merge<pii>, pushUpd<int>, applyUpd<pii, int>> stl(n, {0, 1});
| ^~
./Main.cpp:197:31: warning: unused parameter 'l' [-Wunused-parameter]
197 | void applyUpd(U &u, T &v, int l, int r){
| ~~~~^
./Main.cpp:197:38: warning: unused parameter 'r' [-Wunused-parameter]
197 | void applyUpd(U &u, T &v, int l, int r){
| ~~~~^
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
625 / 625 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
sample_01.txt |
| All |
min_1.txt, min_2.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_20.txt, random_21.txt, random_22.txt, random_23.txt, random_24.txt, random_25.txt, random_26.txt, random_27.txt, random_28.txt, random_29.txt, sample_01.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| min_1.txt |
AC |
1 ms |
3632 KiB |
| min_2.txt |
AC |
1 ms |
3604 KiB |
| random_01.txt |
AC |
1 ms |
3624 KiB |
| random_02.txt |
AC |
1 ms |
3540 KiB |
| random_03.txt |
AC |
1 ms |
3720 KiB |
| random_04.txt |
AC |
1 ms |
3652 KiB |
| random_05.txt |
AC |
2 ms |
3752 KiB |
| random_06.txt |
AC |
1 ms |
3732 KiB |
| random_07.txt |
AC |
2 ms |
3800 KiB |
| random_08.txt |
AC |
203 ms |
19836 KiB |
| random_09.txt |
AC |
174 ms |
4656 KiB |
| random_10.txt |
AC |
25 ms |
19920 KiB |
| random_11.txt |
AC |
119 ms |
14912 KiB |
| random_12.txt |
AC |
311 ms |
19904 KiB |
| random_13.txt |
AC |
300 ms |
16520 KiB |
| random_14.txt |
AC |
202 ms |
19916 KiB |
| random_15.txt |
AC |
151 ms |
15048 KiB |
| random_16.txt |
AC |
202 ms |
19860 KiB |
| random_17.txt |
AC |
180 ms |
5192 KiB |
| random_18.txt |
AC |
197 ms |
19924 KiB |
| random_19.txt |
AC |
58 ms |
7048 KiB |
| random_20.txt |
AC |
312 ms |
19848 KiB |
| random_21.txt |
AC |
287 ms |
11984 KiB |
| random_22.txt |
AC |
305 ms |
19924 KiB |
| random_23.txt |
AC |
187 ms |
19924 KiB |
| random_24.txt |
AC |
226 ms |
30140 KiB |
| random_25.txt |
AC |
293 ms |
27080 KiB |
| random_26.txt |
AC |
195 ms |
26960 KiB |
| random_27.txt |
AC |
245 ms |
29636 KiB |
| random_28.txt |
AC |
232 ms |
30160 KiB |
| random_29.txt |
AC |
228 ms |
33436 KiB |
| sample_01.txt |
AC |
1 ms |
3600 KiB |