Cod sursa(job #65732)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 11 iunie 2007 20:25:53
Problema Hotel Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 2.68 kb
//#define VDEBUG
#ifndef VDEBUG
#pragma options -3 -G -Z -r -O2
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef VDEBUG
#define 	VSQR	4
#define 	VSHF	2
int stat[VSQR], sfx[VSQR];
int xstat[VSQR][VSQR];
#else
#define 	VSQR	(1<<17)
#define 	VSHF	7
//#define 	VSQR	32
//#define 	VSHF	5
char stat[VSQR], sfx[VSQR];
char xstat[1<<15][128];
#endif

int stl[VSQR], stm[VSQR], str[VSQR];

void upd_stat(int s) {
	int x, mx, w;

	// left
	for(x = 0; x < VSQR && xstat[s][x]; x++)
		;
	if(x == VSQR) { stat[s] = 1; return; }
	stl[s] = x;
	// right
	for(x = VSQR-1; xstat[s][x]; x--)
		;
	str[s] = VSQR-1 - x;
	// middle
	w = 0; mx = 0;
	for(x = stl[s] + 1; x < VSQR; x++) {
		if(xstat[s][x])
			w++;
		else {
			if(mx < w) mx = w;
			w = 0;
		}
	}
	stm[s] = mx;
}

void update(int s, int e, int v) {
	int sq, eq, pxs, pxe, sl, el;
	int x;

	sq = s >> VSHF; eq = e >> VSHF;
	pxs = s & (VSQR-1); pxe = e & (VSQR-1);
	if(sq == eq) {
		if(sfx[sq]) { sfx[sq] = 0; memset(xstat[sq], stat[sq], 
sizeof(xstat[sq])); }
		if(!v && stat[sq]) { stat[sq] = 0; }
		for(x = pxs; x <= pxe; x++)
			xstat[sq][x] = v;
		upd_stat(sq);
	}
	else {
		sl = pxs ? sq + 1 : sq;
		el = (pxe == VSQR-1) ? eq : eq - 1;
		for(x = sl; x <= el; x++) {
			stat[x] = v; stl[x] = stm[x] = str[x] = 0; sfx[x] = 1;
		}
		if(pxs) {
			if(sfx[sq]) { sfx[sq] = 0; memset(xstat[sq], stat[sq], 
sizeof(xstat[sq])); }
			if(!v && stat[sq]) { stat[sq] = 0; }
			for(x = pxs; x < VSQR; x++)
				xstat[sq][x] = v;
			upd_stat(sq);
		}
		if(pxe != VSQR-1) {
			if(sfx[eq]) { sfx[eq] = 0; memset(xstat[eq], stat[eq], 
sizeof(xstat[eq])); }
			if(!v && stat[eq]) { stat[eq] = 0; }
			for(x = 0; x <= pxe; x++)
				xstat[eq][x] = v;
			upd_stat(eq);
		}
	}
}
int query() {
	int x;
	int mx, w;

	mx = 0;
	w = 0;
	for(x = 0; x < VSQR; x++) {
		if(stat[x])
			w += VSQR;
		else {
			w += stl[x];
			if(w > mx) mx = w;
			if(stm[x] > mx)	mx = stm[x];
			w = str[x];
		}
	}
	if(w > mx) mx = w;
	return mx;
}
void init(int n) {
	memset(stat, 1, sizeof(stat));
	memset(sfx, 1, sizeof(sfx));
	update(n, VSQR*VSQR - 1, 0);
}

int main() {
	FILE *fp, *fpo;
	int c, cx, cy;
	int n;
	long l;

	fp = fopen("hotel.in", "rt");
	fpo = fopen("hotel.out", "wt");
	fscanf(fp, "%d%ld", &n, &l);

	init(n);
	for(; l; l--) {
		fscanf(fp, "%d", &c);
		switch(c) {
		case 1:
			fscanf(fp, "%d%d", &cx, &cy);
			cx--;
			cy += cx - 1;
			update(cx, cy, 0);
			break;
		case 2:
			fscanf(fp, "%d%d", &cx, &cy);
			cx--;
			cy += cx - 1;
			update(cx, cy, 1);
			break;
		case 3:
			fprintf(fpo, "%d\n", query());
		}
	}
	fclose(fpo);
	fclose(fp);

	return 0;
}