Cod sursa(job #1695567)

Utilizator mika17Mihai Alex Ionescu mika17 Data 27 aprilie 2016 14:22:17
Problema Hotel Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <string.h>
#include <stdio.h>
#include <math.h>

int main() {

	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	
	int n, p, i, j, k, l, r, count, result, dd, lelp, rilp;
	
	scanf("%d%d", &n, &p);
	
	int S = sqrt(n);
	
	int one[333];
	int two[100001];
	
	memset(one, 0, sizeof(one));
	memset(two, 0, sizeof(two));
	
	for(i = 0; i < p; i++) {
	
		scanf("%d", &k);
		switch(k) {
		
			case 1:
			
				
			case 2:
				scanf("%d%d", &l, &r);
				
				r = l + r - 1;
				
				lelp = (l - 1) / S + 1;
				rilp = (r - 1) / S + 1;
				
				for(j = S * lelp - S + 1; j <= S * lelp; j++) {
					if(one[lelp] != 2) two[j] = one[lelp];
				}
				
				//printf("%d %d\n", lelp, rilp);
				
				for(j = S * rilp - S + 1; j <= S * rilp; j++) {
					if(one[rilp] != 2) two[j] = one[rilp];
				}
				
				  // printf("-------------\n");
				  // for(dd = 1; dd <= n / S; dd++) {
					  // printf("%d ", one[dd]);
				  // }
				
				  // printf("\n");
				  // printf("\n");
				  // for(dd = 1; dd <= n; dd++) {
					  // printf("%d ", two[dd]);
				  // }
				  // printf("\n");
				  // printf("-------------\n");
				
				one[lelp] = 2;
				one[rilp] = 2;
				
				for(j = l; j <= r; ) {
					
					if( (j - 1) % S == 0 && j - 1 + S <= r) {
						one[(j - 1) / S + 1] = (k == 1 ? 1 : 0);
						j += S;
					}
					else {
						two[j] = (k == 1 ? 1 : 0);
						j ++;
					}
					//printf("%d\n", j);
				}
				
				break;
			case 3:
				
				// printf("-------------\n");
				// for(dd = 1; dd <= n / S; dd++) {
					// printf("%d ", one[dd]);
				// }
				
				// printf("\n");
				// printf("\n");
				// for(dd = 1; dd <= n; dd++) {
					// printf("%d ", two[dd]);
				// }
				// printf("\n");
				// printf("-------------\n");
				
				count = 0, result = 0;
				for(j = 1; j <= n;) {
				
					if(one[(j - 1) / S + 1] == 0 && j + S - 1 <= n) {
						count += S;
						j += S;
					}
					else if (one[(j - 1) / S + 1] != 1 && two[j] == 0) {
						count ++;
						j ++;
					}
					else {
						if( result < count ) {
							result = count;
						}
						count = 0;
						j++;
					}
					//printf("%d\n", count);
				}
				
				if( result < count ) {
					result = count;
				}
				
				printf("%d\n", result);
				
				break;
		}
	}


	return 0;
}