Cod sursa(job #2310999)

Utilizator Lazar_LaurentiuLazar Laurentiu Lazar_Laurentiu Data 2 ianuarie 2019 14:38:25
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#define y first
#define x second

using namespace std;

int n,p,s,d,o,sa,da;
set< pair<int,int> > si;
multiset<int> sl;
vector< pair<int,int> > ids;
void adauga(int st,int dr){
  si.insert(make_pair(dr,st));
  sl.insert(dr-st+1);
}
void adauga_sters(int st,int dr){
  ids.push_back(make_pair(dr,st));
}
void sterge(){
  for(auto i:ids){
    si.erase(make_pair(i.y,i.x));
    multiset<int>::iterator it,it1;
    it=sl.find(i.y-i.x+1);it1=it;it1++;
    sl.erase(it,it1);
//    sl.erase(i.y-i.x+1);
  }
  ids.clear();
}
void afiseaza(int op,int st,int dr){
  cout<<"\\/----------------------------------\\/\n";
  if(op==1)cout<<"eliminare ";
  if(op==2)cout<<"eliberare ";
  if(op==3)cout<<"afisare\n";
  else{
    cout<<st<<" "<<dr<<":\n";
    for(auto i:si)
      cout<<i.x<<" "<<i.y<<"\n\n";
    cout<<"\n---\n";
    for(auto i:sl)
      cout<<i<<" ";
    cout<<"\n";
  }
  cout<<"/\\----------------------------------/\\\n\n\n\n\n";
}

int main()
{
//    adauga(1,2);
//    multiset<int>::iterator it;
//    it=sl.begin();it++;
//    cout<<(it==sl.end());
//    adauga(1,2);
//    adauga(3,4);
//    adauga(4,5);
//    adauga_sters(3,4);sterge();
//    cout<<sl.size();
    ifstream f ("hotel.in");
    ofstream g ("hotel.out");
    f>>n>>p;
    adauga(1,n);
//    set< pair<int,int> >::iterator it;
//    it=si.end(); it--;
//    cout<<(*it).x<<" "<<(*it).y<<'\n';
//    afiseaza(2,1,n);
    while(p--){
      f>>o;
      if(o==1){
        f>>s>>d; d=s+d-1;
        set< pair<int,int> >::iterator it;
        it=si.lower_bound(make_pair(d,0));
        sa=(*it).x; da=(*it).y;
        adauga_sters(sa,da),sterge();
        if(sa!=s)adauga(sa,s-1);
        if(da!=d)adauga(d+1,da);
      } else if(o==2){
        f>>s>>d; d=s+d-1; ids.clear();
        sa=s;da=d;
        if(si.size()){
          set< pair<int,int> >::iterator it;
          it=si.lower_bound(make_pair(d,0));
          if(it!=si.end())
            if((*it).x==da+1){
              da=(*it).y;
              adauga_sters((*it).x,(*it).y);
            }
          if(it!=si.begin()){
            it--;
            if((*it).y==sa-1){
              sa=(*it).x;
              adauga_sters((*it).x,(*it).y);
            }
          }
          sterge();
        }
        adauga(sa,da);
      } else {
        if(sl.size())
          g<<(*sl.rbegin())<<'\n';
        else g<<"0\n";
      }
      //afiseaza(o,s,d);
    }
    f.close ();
    g.close ();
    return 0;
}