Pentru această operație este nevoie să te autentifici.
Cod sursă (job #119307)
Utilizator |
|
IP | ascuns |
---|---|---|---|
Problemă | Beculețe (clasele 9-10) | Compilator | c | 1,54 kb |
Rundă | Tema 15 clasele 9-10 2014/15 | Status | evaluat |
Dată | 18 feb. 2015 02:14:49 | Scor | 10 |
#include <stdio.h>
#define MAX 1563
unsigned bit[MAX];
void set(int i, int x) {
//scrie pe bitul i valoarea x
//intai scrie pe bitul i valoarea 0, folosind o masca cu 0 pe bitul i si 1
//pe toti ceilalti (pentru ca 0 este o
//valoare usor manipulabila cu xor)
//fa un sau exclusiv pe octet, cu x pe bitul pe bitul i si 0 pe toti
//ceilalti, astfel incat bitul i ia valoarea x, iar ceilalti raman la fel
//(0 ^ x = x)
unsigned mask = ~(1 << (i & 31));
bit[i >> 5] = (bit[i >> 5] & mask) ^ (x << (i & 31));
}
int get(int i) {
//i este numarul bitului pe care vreau sa il citesc
//i apartine octetului i / 8 (i >> 3) (pow(2, 3) = 8)
//shiftez la dreapta octetul din care vreau sa citesc
//cu i % 8 (i & 7), ca bitul dorit sa fie ultimul
//fac and cu 1, astfel incat toti bitii sa fie 0, mai putin ultimul,
//care e 0 daca i era 0, sau 1 daca i era 1
return (bit[i >> 5] >> (i & 31)) & 1;
}
int main()
{
int n;
int d;
int l;
int c;
int valoare;
int mask = 0;
int maskhelper = 0;
int lim;
int i;
int j;
FILE *in;
FILE *out;
in = fopen("beculete.in", "r");
fscanf(in, "%d %d %d %d %d", &n, &d, &l, &c, &valoare);
set(0, 1);
for (i = 1; i < n; i++) {
lim = (i >> 5) + 1;
while (i == l && d) {
set(c - 1, valoare);
fscanf(in, "%d %d %d", &l, &c, &valoare);
d--;
}
for (j = 0; j < lim; j++) {
mask = (maskhelper >> 31) | (bit[j] << 1);
maskhelper = bit[j] & 1;
bit[j] ^= mask;
}
}
fclose(in);
out = fopen("beculete.out", "w");
for (i = 0; i < n; i++)
fprintf(out, "%d ", get(i));
fclose(out);
return 0;
}