이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#define f first
#define s second
#define pii pair<int,int>
#define int long long
using namespace std;
const int N = 2e5 + 5, mod = 1e9 + 7; // !
int t, block[N], le[N], ri[N], mink[N], Bl = 1200 ;
vector<pii> all, cur, L[N], R[N];
void insert(int l,int r,int id) {
cur.push_back({r - l + 1, id});
block[id] = -1;
if(cur.size() == Bl) {
for(int j = 0; j < cur.size(); j++) all.push_back(cur[j]);
cur.clear();
sort(all.rbegin(), all.rend());
for(int j = 0; j < all.size(); j++) {
int bl = j / Bl;
if(!j || bl != (j - 1)/Bl) L[j].clear(), R[j].clear();
L[bl].push_back({le[all[j].s], all[j].s});
R[bl].push_back({ri[all[j].s], all[j].s});
block[all[j].s] = bl;
}
for(int i = 0; i <= (all.size())/Bl; i++) {
sort(L[i].begin(), L[i].end());
mink[i] = 2e9;
for(int k = 0; k < L[i].size(); k++) mink[i] = min(mink[i], ri[L[i][k].s] - le[L[i][k].s] + 1);
sort(R[i].begin(), R[i].end());
}
}
}
vector<pii> erase(vector<pii> cur, int id) {
vector<pii> new_;
for(int i = 0; i < cur.size(); i++) {
if(cur[i].s != id) new_.push_back(cur[i]);
}
return new_;
}
void remove(int id) {
if(block[id] == -1) {
cur = erase(cur, id);
return;
}
L[block[id]] = erase(L[block[id]], id);
R[block[id]] = erase(R[block[id]], id);
return;
}
int get(int l,int r,int k) {
if(r - l + 1 < k) return 0;
int cnt = 0;
for(int i = 0; i < cur.size(); i++) {
int id = cur[i].s;
if(ri[id] - le[id] + 1 >= k && le[id] <= r - k + 1 && ri[id] >= l + k - 1) cnt++;
}
for(int j = 0; j <= (all.size()) / Bl; j++) {
if(!L[j].size()) continue;
if(mink[j] >= k) {
pii p;
cnt += L[j].size();
p = {r - k + 1, 1e7};
cnt -= L[j].size() - (upper_bound(L[j].begin(), L[j].end(), p) - L[j].begin());
p = {l + k - 1, -1};
// for(int aa = 0; aa < R[j].size(); aa++) cout << R[j][aa].f <<" "<<R[j][aa].s <<"---"<< l <<" "<< k - 1 << endl;
cnt -= (upper_bound(R[j].begin(), R[j].end(), p) - R[j].begin()) ;
}
else {
for(int i = 0; i < L[j].size(); i++) {
int id = L[i][j].s;
if(ri[id] - le[id] + 1 >= k && le[id] <= r - k + 1 && ri[id] >= l + k - 1) cnt++;
}
break;
}
}
return cnt;
}
int get(int x,int xo) {
x = x ^ (t * xo);
return x;
}
main() {
int n;
cin >> n >> t;
int xo = 0, idx = -1;
for(int i = 1; i <= n; i++) {
int type; cin >> type;
if(type == 1) {
int l,r;
cin >> l >> r;
le[++idx] = l; ri[idx] = r;
l = get(l, xo), r = get(r, xo);
if(l >= r) swap(l, r);
insert(l,r,idx);
}
else if(type == 2) {
int id;
cin >> id;
remove(id - 1);
}
else {
int l,r,k;
cin >> l >> r >> k;
l = get(l, xo), r = get(r, xo);
if(l > r) swap(l, r);
xo = get(l,r,k);
cout << xo << endl;
}
}
}
컴파일 시 표준 에러 (stderr) 메시지
segments.cpp: In function 'void insert(long long int, long long int, long long int)':
segments.cpp:14:16: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
14 | if(cur.size() == Bl) {
| ~~~~~~~~~~~^~~~~
segments.cpp:15:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
15 | for(int j = 0; j < cur.size(); j++) all.push_back(cur[j]);
| ~~^~~~~~~~~~~~
segments.cpp:19:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
19 | for(int j = 0; j < all.size(); j++) {
| ~~^~~~~~~~~~~~
segments.cpp:26:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'long long unsigned int' [-Wsign-compare]
26 | for(int i = 0; i <= (all.size())/Bl; i++) {
| ~~^~~~~~~~~~~~~~~~~~
segments.cpp:29:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
29 | for(int k = 0; k < L[i].size(); k++) mink[i] = min(mink[i], ri[L[i][k].s] - le[L[i][k].s] + 1);
| ~~^~~~~~~~~~~~~
segments.cpp: In function 'std::vector<std::pair<long long int, long long int> > erase(std::vector<std::pair<long long int, long long int> >, long long int)':
segments.cpp:36:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
36 | for(int i = 0; i < cur.size(); i++) {
| ~~^~~~~~~~~~~~
segments.cpp: In function 'long long int get(long long int, long long int, long long int)':
segments.cpp:53:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
53 | for(int i = 0; i < cur.size(); i++) {
| ~~^~~~~~~~~~~~
segments.cpp:57:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'long long unsigned int' [-Wsign-compare]
57 | for(int j = 0; j <= (all.size()) / Bl; j++) {
| ~~^~~~~~~~~~~~~~~~~~~~
segments.cpp:69:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
69 | for(int i = 0; i < L[j].size(); i++) {
| ~~^~~~~~~~~~~~~
segments.cpp: At global scope:
segments.cpp:82:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
82 | main() {
| ^~~~
# | 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... |