Cod sursa(job #1292812)

Utilizator hrazvanHarsan Razvan hrazvan Data 14 decembrie 2014 20:12:36
Problema Hotel Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <stdio.h>
#define MAXNOD 262144
int arbst[MAXNOD + 1], arbdr[MAXNOD + 1], arbmax[MAXNOD + 1], a, b;

int max2(int a, int b){
  return a > b ? a : b;
}

int max3(int a, int b, int c){
  return max2(max2(a, b), c);
}

void init(int p, int st, int dr){
  arbst[p] = arbdr[p] = arbmax[p] = dr - st + 1;
  if(st != dr){
    int m = (st + dr) / 2;
    init(2 * p, st, m);
    init(2 * p + 1, m + 1, dr);
  }
}

void update(int p, int st, int dr, char tip, char sus){
  if(st >= a && dr <= b){
    if(tip == 0)
      arbst[p] = arbdr[p] = arbmax[p] = 0;
    else
      arbst[p] = arbdr[p] = arbmax[p] = dr - st + 1;
  }
  else{
    if(sus == 2){
      if(arbmax[p] == 0)
        sus = 1;
      if(arbmax[p] == dr - st + 1)
        sus = 0;
    }
    int m = (st + dr) / 2;
    char g = 0, h = 0;
    if(b > m && a <= dr){
      update(2 * p + 1, m + 1, dr, tip, sus);
      h = 1;
    }
    if(a <= m && b >= st){
      update(2 * p, st, m, tip, sus);
      g = 1;
    }
    if(!g){
      if(sus == 0)
        arbst[2 * p] = arbdr[2 * p] = arbmax[2 * p] = m - st + 1;
      if(sus == 1)
        arbst[2 * p] = arbdr[2 * p] = arbmax[2 * p] = 0;
    }
    if(!h){
      if(sus == 0)
        arbst[2 * p + 1] = arbdr[2 * p + 1] = arbmax[2 * p + 1] = dr - m;
      if(sus == 1)
        arbst[2 * p + 1] = arbdr[2 * p + 1] = arbmax[2 * p + 1] = 0;
    }
    arbst[p] = arbst[2 * p];
    if(arbst[2 * p] == m - st + 1)
      arbst[p] += arbst[2 * p + 1];
    arbdr[p] = arbdr[2 * p + 1];
    if(arbdr[2 * p + 1] == dr - m)
      arbdr[p] += arbdr[2 * p];
    arbmax[p] = max3(arbmax[2 * p], arbmax[2 * p + 1], arbdr[2 * p] + arbst[2 * p + 1]);
  }
}

int main(){
  FILE *in = fopen("hotel.in", "r");
  FILE *out = fopen("hotel.out", "w");
  int n, p, i, t;
  char up[3] = {0, 0, 1};
  fscanf(in, "%d%d", &n, &p);
  init(1, 1, n);
  for(i = 0; i < p; i++){
    fscanf(in, "%d", &t);
    if(t == 1 || t == 2){
      fscanf(in, "%d%d", &a, &b);
      b += a - 1;
      update(1, 1, n, up[t], 2);
    }
    else
      fprintf(out, "%d\n", arbmax[1]);
  }
  fclose(in);
  fclose(out);
  return 0;
}