Пример #1
0
void solve() {
    int op;
    int a, b;

    for (int i = 0; i < M; ++i) {
        scanf("%d%d%d", &op, &a, &b);

        if (op == 1) {
            printf("%d\n", getXor(a, b));
        } else {
            set(a, (v[a] ^ b));
            v[a] = b;
        }
    }
}
Пример #2
0
inline int getXor(int a, int b) {
    return (getXor(b) ^ getXor(a - 1));
}
Пример #3
0
int main(int argc,char** argv){
	init(HOST,PORT);
	msg t, *r;
	char nr_secv_sender = 0;
  	
	FILE *fd = fopen("date_intrare", "r");	
	
	//variabile folosite pentru a scrie data si ora in fisierul log.txt;    
	time_t timp = time(NULL);
	struct tm timp_str = *(localtime(&timp));

	//alegem o dimensiune de pachet aleatoare, care imi intoarca un numar intre 1 si 60;
	int rnd = rand() % 61;
	
	//cat timp mai citesc din fisier;
	while(fgets(t.payload, rnd, fd) != NULL){
		//pun textul in payload;
		t.len = strlen(t.payload);
		//calculez CheckSum
		char CheckSum = getXor(t.payload);	
		
		//printez data, ora, numarul secventei, payloadul si CheckSumul cadrului trimis;		
		printf("[sender] %d-%02d-", timp_str.tm_year + 1900, timp_str.tm_mon + 1);
		printf("%d %2d:%2d:%02d\n", timp_str.tm_mday, timp_str.tm_hour, timp_str.tm_min, timp_str.tm_sec);
		printf("Am trimis urmatorul pachet:\n");
		printf("Seq_No: %d\n", nr_secv_sender);
		printf("Payload: %s\n", t.payload);
		printf("CheckSum: %s\n", toBin(CheckSum));
		printf("--------------------------------------------------------------------\n");
		
		//pun paritatea pe penultima pozitie
		t.payload[t.len + 2] = CheckSum;
		//pun seq_nr pe ultima pozitie
		t.payload[t.len + 3] = nr_secv_sender;

		//trimit mesajul
		send_message(&t);

		//resetez dimensiunea pachetului de trimis  	
		rnd = rand() % 61;

		//primesc ack; setez valoarea de timeout la 200 ms
		r = receive_message_timeout(200);
		
		//cat timp nu am trimis pachetul in timp util;
		while(r == NULL){
			//printez data, ora, numarul secventei, payloadul si CheckSumul cadrului trimis;	
			printf("[sender] %d-%02d-", timp_str.tm_year + 1900, timp_str.tm_mon + 1);
			printf("%d %2d:%2d:%02d\n", timp_str.tm_mday, timp_str.tm_hour, timp_str.tm_min, timp_str.tm_sec);
			printf("Am trimis urmatorul pachet:\n");
			printf("Seq_No: %d\n", nr_secv_sender);
			printf("Payload: %s\n", t.payload);
			printf("CheckSum: %s\n", toBin(CheckSum));
			printf("--------------------------------------------------------------------\n");
			send_message(&t);
			r = receive_message_timeout(200);
		}	
		
		char nr_secv_receiver = r->payload[0];
		
		//cat timp primesc ack pentru acelasi pachet, il retrimit
		//si reprimesc ack pentru a ma asigura ca a fost trimis bine
		while(nr_secv_receiver == nr_secv_sender || r == NULL){
			//printez data, ora, numarul secventei, payloadul si CheckSumul cadrului trimis;
			printf("[sender] %d-%02d-", timp_str.tm_year + 1900, timp_str.tm_mon + 1);
			printf("%d %2d:%2d:%02d\n", timp_str.tm_mday, timp_str.tm_hour, timp_str.tm_min, timp_str.tm_sec);
			printf("Am trimis urmatorul pachet:\n");
			printf("Seq_No: %d\n", nr_secv_sender);
			printf("Payload: %s\n", t.payload);
			printf("CheckSum: %s\n", toBin(CheckSum));
			printf("--------------------------------------------------------------------\n");
			send_message(&t);
			r = receive_message_timeout(200);
			nr_secv_receiver = r->payload[0];
		}
		//incrementez numarul secventei;
		nr_secv_sender++;
	}

	return 0;
}