Submission #3150045


Source Code Expand

#include <bits/stdc++.h>
#include <tmmintrin.h>
using namespace std;

using VI = vector<int>;
using VVI = vector<VI>;
using PII = pair<int, int>;
using LL = long long;
using VL = vector<LL>;
using VVL = vector<VL>;
using PLL = pair<LL, LL>;
using VS = vector<string>;

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

#define FF first
#define SS second

template<class T>
void maxi(T& x, T y){
  if(x < y) x = y;
}
template<class T>
void mini(T& x, T y){
  if(x > y) x = y;
}


const double EPS = 1e-10;
const double PI  = acos(-1.0);
const LL MOD = 1e9+7;

constexpr int BLOCK = 4;

__attribute__((aligned(16)))
int as[100010];
__attribute__((aligned(16)))
int lacc[100010];
__attribute__((aligned(16)))
int racc[100010];
__attribute__((aligned(16)))
int lacc_b[100010/BLOCK];
__attribute__((aligned(16)))
int tmp[4];

inline int iceil(int a, int b){
  return (a + b - 1) / b;
}

__attribute__((always_inline))
inline __m128i my_mm_max_epi32(__m128i a, __m128i b){
  __asm("pmaxsd %1, %0" : "+x" (a) : "xm" (b));
  return a;
}

//#define USE_SSE

int main(){
  cin.tie(0);
  ios_base::sync_with_stdio(false);

  int N, Q;
  cin >> N >> Q;
  REP(i,N) cin >> as[i];
  for(int i=0;i+BLOCK<=N;i+=BLOCK){
	lacc[i] = as[i];
	FOR(j,1,BLOCK)
	  lacc[i+j] = lacc[i+j-1] & as[i+j];

	lacc_b[i/BLOCK] = lacc[i+BLOCK-1];
  }

  racc[0] = as[0];
  FOR(i,1,N)
	racc[i] = racc[i-1] ^ as[i];

  int ans;
  int l, r;
  cin >> l >> r;
  --l;
  REP(q,Q){
	if(r-l < 2 || r > N || l < 0) break;
	// solve ans(0-index)
	ans = 1<<31;
	int a = ~0;
	const int bb = l/BLOCK;
	const int be = (r-1)/BLOCK;
	const int  R = racc[r-1];
	//FOR(i,l,r) cout<<as[i]<<",";	cout<<endl;
		
	if(bb == be){
	  for(int i=l;i<r-1;++i){
		a &= as[i];
		maxi(ans, a - (R ^ racc[i]));
	  }
	}
	else{
	  FOR(i,l,(bb+1)*BLOCK){
		a &= as[i];
		maxi(ans, a - (R ^ racc[i]));
		//cout<<i<<","<<a<<"-"<<(R ^ racc[i])<<":"<<ans<<endl;
	  }

	  
#ifdef USE_SSE
	  auto X = _mm_set1_epi32(R);
	  auto maxs = _mm_set1_epi32(ans);

	  for(int b=bb+1;b<be;++b){
		const int ix = b * BLOCK;
		auto a_dup = _mm_set1_epi32(a);
		auto aa = _mm_load_si128((__m128i const*)&lacc[ix]);
		auto ands = _mm_and_si128(a_dup, aa);
		auto xx = _mm_load_si128((__m128i const*)&racc[ix]);
		auto xss = _mm_xor_si128(X, xx);
		auto res = _mm_sub_epi32(ands, xss);
		maxs = my_mm_max_epi32(maxs, res);

		a &= lacc_b[b];
	  }

	  _mm_store_si128((__m128i*)tmp, maxs);
	  ans = max(max(tmp[0], tmp[1]), max(tmp[2], tmp[3]));
#else
	  for(int b=bb+1;b<be;++b){
		for(int d=0;d<BLOCK;++d){
		  const int ix = b * BLOCK + d;
		  int a_ = a & lacc[ix];
		  int x_ = R ^ racc[ix];
		  maxi(ans, a_ - x_);
		}
		a &= lacc_b[b];
	  }
#endif
	  
	  for(int i=be*BLOCK;i<r-1;++i){
		a &= as[i];
		maxi(ans, a - (R ^ racc[i]));
	  }
	}
	
	cout << ans << endl;
	ans = abs(ans);

	if(q < Q-1){
	  cin >> l >> r;
	  l = (l + ans) % N + 1;
	  r = (r + ans) % N + 1;
	  --l;
	}
  }

  return 0;
}

Submission Info

Submission Time
Task J - XORAND
User okaduki
Language C++14 (GCC 5.4.1)
Score 0
Code Size 3089 Byte
Status WA
Exec Time 4203 ms
Memory 2176 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 100
Status
AC × 2
AC × 7
WA × 6
TLE × 6
Set Name Test Cases
Sample subtask0_sample_01.txt, subtask0_sample_02.txt
All subtask0_sample_01.txt, subtask0_sample_02.txt, subtask1_pow2_01_mini.txt, subtask1_pow2_02_mini.txt, subtask1_pow2_03_OnlyOneLargeSeg.txt, subtask1_pow2_04_UniqueLargeSegs_BitChangesEverytime.txt, subtask1_pow2_05_UniqueLargeSegs.txt, subtask1_pow2_06_randomSegs.txt, subtask1_pow2_07_randomSegs.txt, subtask1_pow2_08_randomSegs.txt, subtask1_pow2_09_x_to_N-x_SegsOnly.txt, subtask1_pow2_10_x_to_N_SegsOnly.txt, subtask1_pow2_11_length_1_3_7_15_31_etc_SegsOnly_BitChangesEverytime.txt, subtask1_pow2_12_1_3_7_15_31_etc_lengthSegsPlusAlpha_BitChangesEverytime.txt, subtask1_random_01.txt, subtask1_random_02.txt, subtask1_result_minmax_01.txt, subtask1_result_minmax_02.txt, subtask1_result_minmax_03.txt
Case Name Status Exec Time Memory
subtask0_sample_01.txt AC 1 ms 256 KB
subtask0_sample_02.txt AC 1 ms 256 KB
subtask1_pow2_01_mini.txt AC 4 ms 256 KB
subtask1_pow2_02_mini.txt AC 4 ms 256 KB
subtask1_pow2_03_OnlyOneLargeSeg.txt WA 11 ms 1536 KB
subtask1_pow2_04_UniqueLargeSegs_BitChangesEverytime.txt TLE 4203 ms 1792 KB
subtask1_pow2_05_UniqueLargeSegs.txt WA 12 ms 1536 KB
subtask1_pow2_06_randomSegs.txt WA 11 ms 1536 KB
subtask1_pow2_07_randomSegs.txt WA 12 ms 1536 KB
subtask1_pow2_08_randomSegs.txt WA 13 ms 1536 KB
subtask1_pow2_09_x_to_N-x_SegsOnly.txt WA 13 ms 1536 KB
subtask1_pow2_10_x_to_N_SegsOnly.txt TLE 4203 ms 2176 KB
subtask1_pow2_11_length_1_3_7_15_31_etc_SegsOnly_BitChangesEverytime.txt TLE 4203 ms 2176 KB
subtask1_pow2_12_1_3_7_15_31_etc_lengthSegsPlusAlpha_BitChangesEverytime.txt TLE 4203 ms 1920 KB
subtask1_random_01.txt TLE 4203 ms 1664 KB
subtask1_random_02.txt TLE 4203 ms 1664 KB
subtask1_result_minmax_01.txt AC 1 ms 256 KB
subtask1_result_minmax_02.txt AC 1 ms 256 KB
subtask1_result_minmax_03.txt AC 1 ms 256 KB