Cod sursa(job #318989)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 30 mai 2009 09:19:07
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <stdio.h>   
#include <algorithm>   
  
using namespace std;   
  
#define MAX_N 130072
  
int n, p, q, i, m, t, p2, tip;   
struct arbore
{
 int nr;
 int st;
 int dr;
 int Mx;
} Arb[4 * MAX_N];

void get_arb_nod(int nod, int st, int dr)
{
 if (Arb[nod * 2].Mx == Arb[nod * 2].nr) Arb[nod].st = Arb[nod * 2].Mx + Arb[nod * 2 + 1].st;
 else Arb[nod].st = Arb[nod * 2].st;
 if (Arb[nod * 2 + 1].Mx == Arb[nod * 2 + 1].nr) Arb[nod].dr = Arb[nod * 2 + 1].Mx + Arb[nod * 2].dr;
 else Arb[nod].dr = Arb[nod * 2 + 1].dr;
 Arb[nod].Mx = Arb[nod * 2].dr + Arb[nod * 2 + 1].st;
 Arb[nod].Mx = max(Arb[nod].Mx, Arb[nod * 2].Mx);
 Arb[nod].Mx = max(Arb[nod].Mx, Arb[nod * 2 + 1].Mx);
 Arb[nod].Mx = max(Arb[nod].Mx, Arb[nod].st);
 Arb[nod].Mx = max(Arb[nod].Mx, Arb[nod].dr);
}

void arb_init(int nod, int st, int dr) {
    if (st != dr) {
	arb_init(nod * 2, st, (st + dr) / 2);
	arb_init(nod * 2 + 1, (st + dr) / 2 + 1, dr);

	Arb[nod].nr = Arb[nod * 2].nr + Arb[nod * 2 + 1].nr;
	get_arb_nod(nod, st, dr);
    }
    else
	if (dr <= n) Arb[nod].st = Arb[nod].dr = Arb[nod].Mx = Arb[nod].nr = 1;
}

void update(int nod, int st, int dr, int val) {
    if (st > q || dr < p) return;

    if (p <= st && dr <= q) {
	if (val == 1) Arb[nod].Mx = Arb[nod].st = Arb[nod].dr = 0;
	else Arb[nod].Mx = Arb[nod].st = Arb[nod].dr = Arb[nod].nr;
    }
    else {
	if (Arb[nod].st == Arb[nod].dr && Arb[nod].dr == Arb[nod].Mx && (Arb[nod].st == 0 || Arb[nod].st == Arb[nod].nr)) {
	    if (Arb[nod].st == 0) {
		Arb[nod * 2].st = Arb[nod * 2].dr = Arb[nod * 2].Mx = 0;
		Arb[nod * 2 + 1].st = Arb[nod * 2 + 1].dr = Arb[nod * 2 + 1].Mx = 0;
	    }
	    else {
		Arb[nod * 2].st = Arb[nod * 2].dr = Arb[nod * 2].Mx = Arb[nod * 2].nr;
		Arb[nod * 2 + 1].st = Arb[nod * 2 + 1].dr = Arb[nod * 2 + 1].Mx = Arb[nod * 2 + 1].nr;
	    }
	}

	update(nod * 2, st, (st + dr) / 2, val);
	update(nod * 2 + 1, (st + dr) / 2 + 1, dr, val);

	get_arb_nod(nod, st, dr);
    }
}

int main()
{
 freopen("hotel.in", "r", stdin);
 freopen("hotel.out", "w", stdout);
 scanf("%d %d", &n, &t);
 p2 = 1;
 while (p2 < n) p2 *= 2;
 arb_init(1, 1, p2);
 while (t--)
 {
  scanf("%d", &tip);
  if (tip < 3)
  {
   scanf("%d %d", &i, &m);
   p = i; q = i + m - 1;
   if (tip == 1) update(1, 1, p2, 1);
   else update(1, 1, p2, 0);
  }
  if (tip == 3) printf("%d\n", Arb[1].Mx);
 }
 return 0;
}