QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#176595 | #6427. Just Another Game of Stones | haze | WA | 0ms | 3628kb | C++23 | 3.1kb | 2023-09-11 20:08:14 | 2023-09-11 20:08:15 |
Judging History
answer
#pragma GCC optimize("Ofast")
#pragma GCC target("avx2,abm,mmx")
#include<bits/stdc++.h>
#define ll long long
#define irep(i,l,r) for(ll i = l; i <= r; ++i)
using namespace std;
inline ll read(){
ll s=0; bool fl = 0;
char chcc=getchar();
while(chcc<'0'||chcc>'9'){if(chcc == '-')fl = 1;chcc = getchar();}
while(chcc>='0'&&chcc<='9') s=(s<<3)+(s<<1)+(chcc^48),chcc=getchar();
return fl?-s:s;
}
const int N = 1200999;
const int itinf = 1000000000;
int n, m;
struct node{
int bsum[31];
// vector<int>bsum;
int xorsum, mn, smn, len, tag;
node(){}
}t[N];
void fdmn(vector<int>aa, int &mn, int &smn){
sort(aa.begin(), aa.end());
unique(aa.begin(), aa.end());
mn = aa[0], smn = aa[1];
}
void update(int x){
fdmn({t[x*2].mn, t[x*2].smn, t[x*2+1].mn, t[x*2+1].smn}, t[x].mn, t[x].smn);
t[x].len = 0, t[x].xorsum = t[x*2].xorsum ^ t[x*2+1].xorsum;
if(t[x*2].mn == t[x].mn)t[x].len += t[x*2].len;
if(t[x*2+1].mn == t[x].mn)t[x].len += t[x*2+1].len;
irep(i,0,31)t[x].bsum[i] = t[x*2].bsum[i] + t[x*2+1].bsum[i];
}
void operate(int x,int lim){
if(t[x].len & 1)t[x].xorsum ^= (lim ^ t[x].mn);
t[x].tag = lim;
int od = t[x].mn, nw = lim;
irep(i,0,31){
t[x].bsum[i] += ((nw & 1) - (od & 1)) * t[x].len;
nw >>= 1, od >>= 1;
}
t[x].mn = lim;
}
void pushdown(int x){
int tag = t[x].tag;
t[x].tag = 0;
if(t[x*2].mn < tag)operate(x*2,tag);
if(t[x*2+1].mn < tag)operate(x*2+1,tag);
}
void build(int x,int l,int r){
if(l == r){
int val;
val = t[x].mn = t[x].xorsum = read();
t[x].len = 1;
t[x].smn = t[x].tag = itinf;
irep(i,0,31){
t[x].bsum[i] += val & 1;
val >>= 1;
}
return;
}
int mid = (l + r) >> 1;
build(x * 2,l, mid);
build(x * 2 + 1, mid + 1, r);
update(x);
return;
}
void modify(int x,int l,int r,int L,int R, int lim){
// x -> max(x, val)
if(l > R || L > r)return;
if(L <= l && r <= R){
if(lim <= t[x].mn)return;
pushdown(x);
if(lim < t[x].smn){
operate(x,lim);
return;
}
int mid = (l + r) >> 1;
if(l == r)return;
modify(x * 2,l, mid, L,R,lim);
modify(x * 2 + 1, mid + 1, r ,L,R,lim);
update(x);
return;
}
pushdown(x);
int mid = (l + r) >> 1;
modify(x * 2,l, mid, L,R,lim);
modify(x * 2 + 1, mid + 1, r ,L,R,lim);
update(x);
return;
}
int xor_query(int x,int l,int r,int L,int R){
if(l > R || L > r)return 0;
if(L <= l && r <= R)return t[x].xorsum;
if(l != r)pushdown(x);
int mid = (l + r) >> 1;
return xor_query(x*2,l,mid,L,R) ^ xor_query(x*2+1,mid+1,r,L,R);
}
int bit_cnt(int x,int l, int r, int L ,int R,int id){
if(l > R || L > r)return 0;
if(L <= l && r <= R)return t[x].bsum[id];
if(l != r)pushdown(x);
int mid = (l + r) >> 1;
return bit_cnt(x *2 ,l,mid,L,R,id) + bit_cnt(x*2+1,mid+1,r,L,R,id);
}
int main(){
n = read(), m = read();
build(1,1,n);
while(m --){
int op = read(), l = read(), r = read(), x = read();
if(op == 1){
modify(1,1,n,l,r,x);
}else{
ll key = xor_query(1,1,n,l,r);
if((key ^ x) == 0){
puts("0");
continue;
}
int hb = log2(key ^ x);
ll ans = bit_cnt(1,1,n,l,r,hb);
if(x & (1 << hb))++ ans;
printf("%lld\n",ans);
}
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 3628kb
input:
5 4 1 2 1 4 1 2 1 3 1 1 2 4 3 2 2 4 4 2 1 4 4
output:
0 0 2
result:
wrong answer 1st numbers differ - expected: '1', found: '0'