Pentru această operație este nevoie să te autentifici.

Cod sursă (job #119307)

Utilizator avatar Pasarel Alex Oltean Pasarel 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;
}