Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC optimize("Ofast")
- //#pragma GCC optimize("O0")
- #pragma GCC target("sse4.1,sse4.2,ssse3,sse3,sse2,sse")
- #pragma GCC target("avx")
- #pragma GCC target("avx2")
- #include <bits/stdc++.h>
- #include <x86intrin.h>
- using namespace std;
- const int maxn = 100000;
- alignas(32) int LEFT[4];
- alignas(32) int RIGHT[4];
- alignas(32) int a[8][maxn * 8];
- void shiftArrays(int n) {
- for (int t = 0; t < 8; t++) {
- int t0 = a[t][0];
- for (int i = 0; i + 1 < 8 * n; i++) a[t][i] = a[t][i + 1];
- a[t][8 * n - 1] = t0;
- }
- }
- int main(int argc, char *argv[]) {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- // cout << __builtin_cpu_supports("avx") << endl;
- // cout << __builtin_cpu_supports("avx2") << endl;
- int n;
- cin >> n;
- for (int i = 0; i < 4; i++) cin >> LEFT[i] >> RIGHT[i];
- for (int i = 0; i < 4 * n; i++) {
- int x;
- cin >> x;
- for (int t = 0; t < 8; t++) {
- int at = (i - t + 8 * n) % (8 * n);
- a[t][at] = a[t][(at + 4 * n) % (8 * n)] = x;
- }
- }
- for (int shiftedTimes = 0; shiftedTimes < 8; shiftedTimes++) {
- for (int firstElement = 0; firstElement < 4 * n; firstElement += 8) {
- bool ok = true;
- for (int j = 0; j < 4; j++) {
- int packStart = firstElement + j * n;
- int delta = packStart % 8;
- packStart -= delta;
- __m256i accum = _mm256_setzero_si256();
- for (int k = 0; k + 8 <= n; k += 8) {
- //todo fix
- __m256i *p = (__m256i *) &a[delta][packStart + k];
- __m256i b = _mm256_load_si256(p);
- __m256i epi_32 = _mm256_add_epi32(accum, b);
- accum = epi_32;
- }
- auto arr = ((int *) &accum);
- int sum = arr[0] + arr[1] + arr[2] + arr[3] + arr[4] + arr[5] + arr[6] + arr[7];
- for (int it = n / 8 * 8; it < n; it++) sum += a[delta][packStart + it];
- if (!(LEFT[j] * n <= sum && sum <= RIGHT[j] * n)) {
- ok = false;
- break;
- }
- }
- if (ok) {
- cout << firstElement + shiftedTimes + 1;
- return 0;
- }
- }
- shiftArrays(n);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment