QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#759362 | #9727. Barkley III | zzuqy | WA | 0ms | 3704kb | C++14 | 4.6kb | 2024-11-18 02:59:01 | 2024-11-18 02:59:01 |
Judging History
answer
#include<cstdio>
#include<algorithm>
#include<cmath>
unsigned long long updateLow(unsigned long long l0, unsigned long long l1,
unsigned long long r0, unsigned long long r1){
return ((~l1) & (~l0) & (~r1) & (r0)) | ((~l1) & (l0) & (~r1) & (~r0));
}
unsigned long long updateHigh(unsigned long long l0, unsigned long long l1,
unsigned long long r0, unsigned long long r1){
return ~(((~l1) & (~l0) & (~r1) & (~r0)) | ((~l1) & (~l0) & (~r1) & (r0)) |
((~l1) & (l0) & (~r1) & (~r0)));
}
struct Node{
Node *ls, *rs;
unsigned long long x0, x1, and_, tag;
inline void pushUp(){
and_ = ls->and_ & rs->and_;
x0 = updateLow(ls->x0, ls->x1, rs->x0, rs->x1);
x1 = updateHigh(ls->x0, ls->x1, rs->x0, rs->x1);
}
inline void update(unsigned long long t, int len){
tag &= t;
and_ &= t;
unsigned long long x0_, x1_;
if(len >= 2){
x0_ = (~x1) & x0 & t;
x1 = ~((~x1) & t);
}
else{
x0_ = ~and_;
x1_ = 0;
}
x0 = x0_;
x1 = x1_;
}
inline void pushDown(int l, int mid, int r){
if(tag == (unsigned long long)-1){
return;
}
ls->update(tag, mid-l+1);
rs->update(tag, r-mid);
tag = -1;
}
};
#define N 1000006
int n;
Node addr_[N*2], *addr = addr_, *root = addr;
unsigned long long a[N];
void build(Node *x, int l, int r){
x->tag = -1;
if(l == r){
x->and_ = a[l];
x->x0 = ~a[l];
x->x1 = 0;
return;
}
x->ls = ++addr;
x->rs = ++addr;
int mid = (l+r) >> 1;
build(x->ls, l, mid);
build(x->rs, mid+1, r);
x->pushUp();
}
void change(Node *x, int l, int r, int pos, unsigned long long k){
if(l == r){
x->and_ = k;
x->x0 = ~k;
x->x1 = 0;
return;
}
int mid = (l+r) >> 1;
x->pushDown(l, mid, r);
if(pos <= mid) change(x->ls, l, mid, pos, k);
else change(x->rs, mid+1, r, pos, k);
x->pushUp();
}
void changeAnd(Node *x, int l, int r, int ql, int qr, unsigned long long k){
if(ql <= l && r <= qr){
x->update(k, r-l+1);
return;
}
int mid = (l+r) >> 1;
x->pushDown(l, mid, r);
if(ql <= mid) changeAnd(x->ls, l, mid, ql, qr, k);
if(qr > mid) changeAnd(x->rs, mid+1, r, ql, qr, k);
x->pushUp();
}
unsigned long long askAnd(Node *x, int l, int r, int ql, int qr){
if(ql <=l && r <= qr){
return x->and_;
}
unsigned long long ans = -1;
int mid = (l+r) >> 1;
x->pushDown(l, mid, r);
if(ql <= mid) ans &= askAnd(x->ls, l, mid, ql, qr);
if(qr > mid) ans &= askAnd(x->rs, mid+1, r, ql, qr);
return ans;
}
void findBit(Node *x, int l, int r, int ql, int qr,
unsigned long long &x0, unsigned long long &x1){
if(ql <= l && r <= qr){
x0 = x->x0;
x1 = x->x1;
return;
}
int mid = (l+r) >> 1;
x->pushDown(l, mid, r);
if(qr <= mid) findBit(x->ls, l, mid, ql, qr, x0, x1);
else if(ql > mid) findBit(x->rs, mid+1, r, ql, qr, x0, x1);
else{
unsigned long long l0 = 0, l1 = 0, r0 = 0, r1 = 0;
findBit(x->ls, l, mid, ql, qr, l0, l1);
findBit(x->rs, mid+1, r, ql, qr, r0, r1);
x0 = updateLow(l0, l1, r0, r1);
x1 = updateHigh(l0, l1, r0, r1);
}
}
int findPos(Node *x, int l, int r, unsigned long long musk){
if(l == r){
return l;
}
int mid = (l+r) >> 1;
x->pushDown(l, mid, r);
if(x->ls->and_ & musk) return findPos(x->rs, mid+1, r, musk);
return findPos(x->ls, l, mid, musk);
}
int findPos(Node *x, int l, int r, int ql, int qr, unsigned long long musk){
if(ql <= l && r <= qr){
if(x->and_ & musk) return -1;
return findPos(x, l, r, musk);
}
int mid = (l+r) >> 1;
x->pushDown(l, mid, r);
int ll = -1, rr = -1;
if(ql <= mid) ll = findPos(x->ls, l, mid, ql, qr, musk);
if(qr > mid) rr = findPos(x->rs, mid+1, r, ql, qr, musk);
return ll == -1 ? rr : ll;
}
int main(){
int q;
scanf("%d%d",&n, &q);
for(int i = 1; i <= n; i++){
scanf("%llu", a+i);
}
build(root, 1, n);
while(q--){
int op, l, r;
unsigned long long x;
scanf("%d", &op);
if(op == 1){
scanf("%d%d%llu", &l, &r, &x);
changeAnd(root, 1, n, l, r, x);
}
else if(op == 2){
scanf("%d%llu", &l, &x);
change(root, 1, n, l, x);
}
else{
scanf("%d%d", &l, &r);
unsigned long long x0 = 0, x1 = 0;
findBit(root, 1, n, l ,r, x0, x1);
int bit = 63;
while(bit >= 0){
if(((x1 >> bit) & 1) == 0 && ((x0 >> bit) & 1) == 1){
break;
}
bit--;
}
unsigned long long ans = -1;
if(l == r){
ans = 0;
}
else if(bit == -1){
ans = askAnd(root, 1, n, l+1, r);
}
else{
int pos = findPos(root, 1, n, l, r, 1ull << bit);
if(pos != l){
ans &= askAnd(root, 1, n, l, pos-1);
}
if(pos != r){
ans &= askAnd(root, 1, n, pos+1, r);
}
}
printf("%llu\n", ans);
}
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3664kb
input:
5 9 7 7 7 6 7 3 1 5 2 1 3 3 1 5 3 1 3 1 1 2 3 3 1 3 2 2 8 3 1 3 3 1 2
output:
7 6 7 3 3 8
result:
ok 6 lines
Test #2:
score: 0
Accepted
time: 0ms
memory: 3704kb
input:
10 10 6760061359215711796 1568091718842717482 1568091718842717482 1568091718842717482 5232472783634052627 8795942500783873690 1568091718842717482 1568091718842717482 1568091718842717482 1568091718842717482 1 3 5 7587422031989082829 3 6 10 1 7 8 5197616143400216932 2 4 2518604563805514908 2 2 4533959...
output:
1568091718842717482 35184908959744 176025477579040 8795942500783873690
result:
ok 4 lines
Test #3:
score: -100
Wrong Answer
time: 0ms
memory: 3652kb
input:
100 100 4263579105072360993 4263579105072360993 4263579105072360993 4263579105072360993 4263579105072360993 4263579105072360993 4263579105072360993 4263579105072360993 4263579105072360993 625967318191814868 4263579105072360993 4263579105072360993 4263579105072360993 4263579105072360993 4263579105072...
output:
576531121047601152 1 576460752303423488 4263579105072360993 1306043896232411137 4263579105072360993 576531121047601152 633397148123136 0 12952010752 562951027425280 1730020640668059136 3458764518266578433 67108864 576531718266945536 0 633397148123136 1729382296723653632 0 1730020640668059136 3533641...
result:
wrong answer 10th lines differ - expected: '1153488865559840256', found: '12952010752'