Cod sursa(job #595443)

Utilizator Smaug-Andrei C. Smaug- Data 12 iunie 2011 17:38:46
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define MAXN 100010

typedef struct leaf {
  int l, r, c;
} leaf;

leaf T[4*MAXN+10];

void Update(int node, int l, int r, int a, int b, int v){
  if(a<=l && r<=b){
    if(!v)
      T[node].c=T[node].l=T[node].r=r-l+1;
    else
      T[node].c=T[node].l=T[node].r=0;
  }
  else {
    int mid=((r-l)>>1)+l, N1=node<<1, N2=(node<<1)+1;

    if(!T[node].c){
      T[N1].c=T[N1].l=T[N1].r=0;
      T[N2].c=T[N2].l=T[N2].r=0;
    }
    if(T[node].c == r-l+1){
      T[N1].c=T[N1].l=T[N1].r=mid-l+1;
      T[N2].c=T[N2].l=T[N2].r=r-mid;
    }

    if(a<=mid)
      Update(N1, l, mid, a, b, v);
    if(b>mid)
      Update(N2, mid+1, r, a, b, v);

    T[node].l=T[N1].l;
    if(T[N1].l == mid-l+1)
      T[node].l+=T[N2].l;
    
    T[node].r=T[N2].r;
    if(T[N2].r == r-mid)
      T[node].r+=T[N1].r;

    T[node].c=max(max(T[node].l, T[node].r), max(T[N1].c, T[N2].c));
    T[node].c=max(T[node].c, T[N1].r+T[N2].l);

  }
}

int main(){

  freopen("hotel.in", "r", stdin);
  freopen("hotel.out", "w", stdout);

  int N, P, i, c, a, b;

  scanf("%d%d", &N, &P);

  for(i=1; i<=N; i++)
    Update(1, 1, N, i, i, 0);

  for(i=0; i<P; i++){
    scanf("%d", &c);
    if(c==1){
      scanf("%d%d", &a, &b);
      Update(1, 1, N, a, a+b-1, 1);
    }
    else if(c==2){
      scanf("%d%d", &a, &b);
      Update(1, 1, N, a, a+b-1, 0);
    }
    else
      printf("%d\n", T[1].c);
  }

  return 0;

}