#include <bits/stdc++.h>
#include "registers.h"
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
using ld = long double;
//#define int ll
#define sz(x) ((int)(x).size())
using pii = pair<int,int>;
using tii = tuple<int,int,int>;
const int BSIZE = 2000;
namespace Utils {
vector<bool> tobits(int x) {
vector<bool> val;
if(x == 0) { val.emplace_back(0); return val; }
while(x > 0) {
val.emplace_back(x & 1);
x >>= 1;
}
return val;
}
vector<bool> multiply(vector<bool> v, int times) {
vector<bool> R;
while(times) {
if(times & 1)
copy(all(v), back_inserter(R));
times >>= 1;
auto X = v;
copy(all(X), back_inserter(v));
}
return R;
}
vector<bool> concat(vector<bool> a, vector<bool> b) { copy(all(b), back_inserter(a)); return a; }
vector<bool> ceil(vector<bool> a) {
a.resize(BSIZE, 0);
return a;
}
}
using namespace Utils;
#warning LEFT INSEAMNA CA SE MISCA i --> i - p (adica la stanga)
namespace PulaMea {
void amove(int t, int y) { append_move(t, y); }
void astore(int t, vector<bool> a) { append_store(t, a); }
void aand(int t, int x, int y) { append_and(t, x, y); }
void aor(int t, int x, int y) { append_or(t, x, y); }
void axor(int t, int x, int y) { append_xor(t, x, y); }
void anot(int t, int x) { append_not(t, x); }
void aright(int t, int x, int y) { append_left(t, x, y); }
void aleft(int t, int x, int y) { append_right(t, x, y); }
void asum(int t, int x, int y) { append_add(t, x, y); }
void print(int t) { append_print(t); }
}
using namespace PulaMea;
#define plus ashgafshasiuhqeuiasf
const int plus = 99;
const int onesingle = 98;
const int onlyplus = 97;
const int ender = 96;
const int not_ender = 95;
const int inner = 94;
const int not_inner = 93;
const int onlyhere = 92;
int forinternuse = 3;
int forspaces = 91;
map<int, int> atrspace;
int foundsofar = 0;
void divide(int node, int n, int k, int q, int space) {
int times = (3 * n + 1) / 2 - 1;
times += times % 2;
for(int i = 0; i < times; i++) {
int even = 25, odd = node, thirdparty = 1, aux = 2, aux_2 = 3;
int nnode = 14;
if(i % 2 == 1) {
odd = 10;
aand(nnode, node, inner);
aleft(nnode, nnode, k);
aand(node, not_inner, node);
swap(nnode, node);
}
auto spaces = multiply(tobits(0), space);
int simple;
if(atrspace.count(space) == 0)
astore(atrspace[space] = (simple = (forspaces--)),
ceil(multiply(concat(concat(multiply(tobits(1), k), spaces), concat(multiply(tobits(0), k), spaces)), (BSIZE / (2 * (k + space))))));
else
simple = atrspace[space];
//cerr << simple << '\n';
aand(even, node, simple);
aleft(odd, node, k + space);
aand(odd, odd, simple);
int wordsize = (k + space) * 2;
anot(aux, even);
asum(thirdparty, odd, aux);
aand(thirdparty, thirdparty, onlyplus);
for(int i = 1; i <= k; i *= 2) {
aleft(aux, thirdparty, i);
aor(thirdparty, aux, thirdparty);
}
axor(aux_2, odd, even);
aand(aux, thirdparty, odd);
anot(thirdparty, thirdparty);
aand(thirdparty, thirdparty, even);
asum(odd, thirdparty, aux); // unde le punem pe alea mici
axor(even, odd, aux_2);
aright(even, even, k);
aor(odd, odd, even);
if(n % 2 == 1) {
aand(aux, ender, odd);
aleft(aux, aux, k);
aor(odd, odd, aux);
aand(odd, odd, onlyhere);
}
node = odd;
if(i % 2 == 1) {
aright(node, node, k);
aor(nnode, node, nnode);
swap(node, nnode);
}
//append_print(node);
}
return;
}
void construct_instructions(int s, int n, int k, int q) {
int space = 0;
auto spaces = multiply(tobits(0), space);
astore(plus, ceil(multiply(concat(concat(multiply(tobits(1), k + 1), spaces), concat(multiply(tobits(0), k - 1), spaces)), (BSIZE / (2 * (k + space))))));
astore(onlyplus, ceil(multiply(concat(concat(multiply(tobits(0), k), tobits(1)), multiply(tobits(0), space * 2 + k - 1)), BSIZE / (2 * (k + space)))));
astore(onesingle, ceil(multiply(tobits(1), k)));
astore(ender, ceil(concat(multiply(tobits(0), n * k), multiply(tobits(1), k))));
astore(inner, ceil(concat(multiply(tobits(0), k), multiply(tobits(1), k * (n - 1 - (n - 1) % 2)))));
astore(onlyhere, ceil(multiply(tobits(1), k * n)));
anot(not_ender, ender);
anot(not_inner, inner);
divide(0, n, k, q, 0);
return;
}
/**
Istenem! Nu poate fi real.
-- Surse verificate
*/
Compilation message
registers.cpp:47:2: warning: #warning LEFT INSEAMNA CA SE MISCA i --> i - p (adica la stanga) [-Wcpp]
47 | #warning LEFT INSEAMNA CA SE MISCA i --> i - p (adica la stanga)
| ^~~~~~~
registers.cpp: In function 'void divide(int, int, int, int, int)':
registers.cpp:107:11: warning: unused variable 'wordsize' [-Wunused-variable]
107 | int wordsize = (k + space) * 2;
| ^~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
344 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
0 ms |
348 KB |
Wrong answer detected in grader |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
768 KB |
Output is correct |
3 |
Correct |
1 ms |
768 KB |
Output is correct |
4 |
Correct |
1 ms |
768 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
0 ms |
348 KB |
Wrong answer detected in grader |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
1 ms |
768 KB |
Output is correct |
4 |
Correct |
2 ms |
764 KB |
Output is correct |
5 |
Correct |
1 ms |
768 KB |
Output is correct |
6 |
Correct |
2 ms |
604 KB |
Output is correct |
7 |
Correct |
1 ms |
604 KB |
Output is correct |