#pragma GCC target("sse4.1")
#include <iostream>
#include <immintrin.h>
using namespace std;
int find(int a[], int n, int x) {
__m128i needle = _mm_set_epi32(x, x, x, x);
int i = 0;
while(i+4 <= n) {
__m128i dat = _mm_load_si128(reinterpret_cast<const __m128i*>(a + i));
__m128i r = _mm_cmpeq_epi32(dat, needle);
int msk = _mm_movemask_epi8(r);
int xx = __builtin_clz(msk);
if(msk) return i + ((32 - __builtin_clz(msk)) >> 2) - 1;
i += 4;
}
while(i < n) {
if(a[i] == x) return i;
i++;
}
return -1;
}
int main()
{
int a[] __attribute__((aligned(16))) = {1,4, 2, 5, -10, 12, 55, 3, -4, -5};
int n = 10;
int x = -10;
cout << find(a, n, 0) << endl;
cout << find(a, n, 1) << endl;
cout << find(a, n, 4) << endl;
cout << find(a, n, 2) << endl;
cout << find(a, n, 5) << endl;
cout << find(a, n, -10) << endl;
cout << find(a, n, 12) << endl;
cout << find(a, n, -5) << endl;
return 0;
}
I3ByYWdtYSBHQ0MgdGFyZ2V0KCJzc2U0LjEiKQojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpbW1pbnRyaW4uaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBmaW5kKGludCBhW10sIGludCBuLCBpbnQgeCkgewogICAgX19tMTI4aSBuZWVkbGUgPSBfbW1fc2V0X2VwaTMyKHgsIHgsIHgsIHgpOwogICAgaW50IGkgPSAwOwogICAgd2hpbGUoaSs0IDw9IG4pIHsKICAgICAgICBfX20xMjhpIGRhdCA9IF9tbV9sb2FkX3NpMTI4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgX19tMTI4aSo+KGEgKyBpKSk7CiAgICAgICAgX19tMTI4aSByID0gX21tX2NtcGVxX2VwaTMyKGRhdCwgbmVlZGxlKTsKICAgICAgICBpbnQgbXNrID0gX21tX21vdmVtYXNrX2VwaTgocik7CiAgICAgICAgaW50IHh4ID0gX19idWlsdGluX2Nseihtc2spOwogICAgICAgIGlmKG1zaykgcmV0dXJuIGkgKyAoKDMyIC0gX19idWlsdGluX2Nseihtc2spKSA+PiAyKSAtIDE7CiAgICAgICAgaSArPSA0OwogICAgfQogICAgd2hpbGUoaSA8IG4pIHsKICAgICAgICBpZihhW2ldID09IHgpIHJldHVybiBpOwogICAgICAgIGkrKzsKICAgIH0KICAgIHJldHVybiAtMTsKfQoKaW50IG1haW4oKQp7CiAgICBpbnQgYVtdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkgPSB7MSw0LCAyLCA1LCAtMTAsIDEyLCA1NSwgMywgLTQsIC01fTsKICAgIGludCBuID0gMTA7CiAgICBpbnQgeCA9IC0xMDsKCiAgICBjb3V0IDw8IGZpbmQoYSwgbiwgMCkgPDwgZW5kbDsKICAgIGNvdXQgPDwgZmluZChhLCBuLCAxKSA8PCBlbmRsOwogICAgY291dCA8PCBmaW5kKGEsIG4sIDQpIDw8IGVuZGw7CiAgICBjb3V0IDw8IGZpbmQoYSwgbiwgMikgPDwgZW5kbDsKICAgIGNvdXQgPDwgZmluZChhLCBuLCA1KSA8PCBlbmRsOwogICAgY291dCA8PCBmaW5kKGEsIG4sIC0xMCkgPDwgZW5kbDsKICAgIGNvdXQgPDwgZmluZChhLCBuLCAxMikgPDwgZW5kbDsKICAgIGNvdXQgPDwgZmluZChhLCBuLCAtNSkgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQo=