Cod sursa(job #1692513)

Utilizator stoianmihailStoian Mihail stoianmihail Data 21 aprilie 2016 00:04:17
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.85 kb
#include <stdio.h>
#include <set>

using std::set;
using std::multiset;

#define aibSize 131072
#define Nadejde 100000

int N, M;
char sign[Nadejde + 2];
int aib[aibSize + 1];

set <int> sl;
set <int>::iterator it;

multiset <int> heap;
multiset <int>::iterator curr;

void add(int x, int val) {
  if (val == 1) {
    if (x != 0) {
      heap.insert(x);
    }
  } else if (x != 0) {
    heap.erase(heap.find(x));
  }
}

void init() {
  int i;

  add(N, +1);
  for (i = 1; i <= N; i++) {
    sign[i] = '0';
  }
}

void push(int x, char c) {
  sl.insert(x);
  sign[x] = c;
}

void pop(int x) {
  sl.erase(x);
  sign[x] = '0';
}

int left(int x) {
  it = sl.lower_bound(x);
  if (it == sl.begin()) {
    return 1;
  } else {
    it--;
    return *it;
  }
}

int right(int x) {
  it = sl.lower_bound(x);
  if (it == sl.end()) {
    return N + 1;
  } else {
    return *it;
  }
}
void test(int x){}/*fprintf(stderr,"Intra la if-ul %d\n",x+1);}
void afis() {
  for(it=sl.begin();it!=sl.end();it++){
    fprintf(stderr,"%d,",*it);
  }
  fprintf(stderr,"\n");
}
  int *val=new int[N+1];
void config(){for(int i=1;i<=N;i++)fprintf(stderr,"%d",val[i]);fprintf(stderr,"\n");}
void config1(){for(int i=1;i<=N+1;i++)fprintf(stderr,"%c",sign[i]);fprintf(stderr,"\n");}
*/
int main(void) {
  int i, a, b, task, lo, hi;
  FILE *f = fopen("hotel.in", "r");
  freopen("hotel.out", "w", stdout);

  fscanf(f, "%d %d", &N, &M);
  init();


  /* Raspunde la intrebari. */
  for (i = 1; i <= M; i++) {
    //fprintf(stderr, "Intrebarea: %d\n", i);
    fscanf(f, "%d", &task);
    if (task == 1) {
      fscanf(f, "%d %d", &a, &b);
      b += a - 1;
/*
      for(int j=a;j<=b;j++){
        val[j]=1;
      }
*/
      /* Trebuie sa fim fix sub "a". */
      if (sl.empty()) {
        lo = 1;
        hi = N + 1;
      } else {
        it = sl.upper_bound(a);
        if (it == sl.begin()) {
          lo = 1;
          hi = *it;
        } else if (it == sl.end()) {
          it--;
          lo = *it;
          hi = N + 1;
        } else {
          hi = *it;
          it--;
          lo = *it;
        }
      }

      add(hi - lo, -1);
      add(a - lo, +1);
      add(hi - b - 1, +1);

      if (sign[a] == '-') {
        pop(a);
      } else {
        push(a, '+');
      }
      if (sign[b + 1] == '+') {
        pop(b + 1);
      } else {
        push(b + 1, '-');
      }
    } else if (task == 2) {
      fscanf(f, "%d %d", &a, &b);
      b += a - 1;

     // for(int j=a;j<=b;j++)val[j]=0;

      /* Stergem o secventa inclusa intr-un sir de "1". */
      if (sign[a] != '+' && sign[b + 1] != '-') {
        test(0);
        push(a, '-');
        push(b + 1, '+');

        add(b - a + 1, +1);
      /* Stergem prefixul unui sir de "1". */
      } else if (sign[a] == '+' && sign[b + 1] != '-') {
        test(1);
        pop(a);
        push(b + 1, '+');

        lo = left(a);
        add(a - lo, -1);
        add(b - lo + 1, +1);
      /* Stergem sufixul unui sir de "1". */
      } else if (sign[a] != '+' && sign[b + 1] == '-') {
        test(2);
        push(a, '-');
        pop(b + 1);

        hi = right(b + 1);
        add(hi - b - 1, -1);
        add(hi - a, +1);
      /* Stergem un sir de "1". */
      } else {
        test(3);
        pop(a);
        pop(b + 1);
/*
        afis();
        config();
        config1();
*/
        lo = left(a);
        hi = right(b + 1);
        //fprintf(stderr,"hai->lo = %d, hi=%d\n",lo,hi);
        add(hi - b - 1, -1);
       // fprintf(stderr,"1");
        add(a - lo, -1);
          //      fprintf(stderr,"1");
        add(hi - lo, +1);
        //fprintf(stderr,"cum");
      }
    } else {
      if (!heap.empty()) {
        curr = --heap.end();
        fprintf(stdout, "%d\n", *curr);
      } else {
        fprintf(stdout, "0\n");
      }
    }
  /*  config();
    config1();
    afis();
    */
  }
  fclose(f);
  fclose(stdout);

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}