Cod sursa(job #1764067)

Utilizator ade_tomiEnache Adelina ade_tomi Data 24 septembrie 2016 22:46:19
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <iostream>
#include <fstream>
#define NMAX 100000
using namespace std;
int type;
struct str
{
    int maxi,st,dr;

};
const int db = 0;
str aint[NMAX * 4 + 4];
void update (int nod, int in, int sf, int a, int b)
{

    if (in >= a && sf <= b)
    {
      //  cout << "s";
        if (type == 2)
            aint[nod].maxi = aint[nod].st = aint[nod].dr = sf - in + 1;
        else
            aint[nod].maxi =aint[nod].st = aint[nod].dr = 0;
        return ;
    }
    int mid = (in + sf) / 2;
    if (aint[nod].maxi == (sf - in + 1))
    {
         aint[2 * nod + 1].st = aint[2 * nod + 1].dr = aint[2 * nod + 1].maxi = ( sf - mid) ;
         aint[2 * nod].st = aint[2 * nod].dr = aint[2 * nod].maxi = (mid - in + 1) ;
    }
     if (aint[nod].maxi == 0)
    {
         aint[2 * nod + 1].st = aint[2 * nod + 1].dr = aint[2 * nod + 1].maxi = 0;
         aint[2 * nod].st = aint[2 * nod].dr = aint[2 * nod].maxi = 0 ;
    }
      
  // cout << in <<" " <<sf << " " << a << " " << b << "\n"; 
    if (mid >= a)       
      update (2 * nod, in, mid, a, b);
    if (mid < b)
        update (2 * nod + 1, mid + 1, sf, a, b);
    
    if (aint[nod * 2].st == mid - in + 1)
        aint[nod].st = aint[2 * nod].st + aint[2 * nod + 1].st;
    else 
        aint[nod].st = aint[2 * nod].st;

    if (aint[2 * nod + 1].dr == sf - mid)
        aint[nod].dr = aint[2 * nod].dr + aint[2 * nod +1].dr;
 //   aint[nod].st = aint[2 * nod].st;
    else 
       aint[nod].dr = aint[2 * nod + 1].dr;
        
    aint[nod].maxi = max (aint[nod * 2].maxi, aint[nod * 2 + 1].maxi);
    aint[nod].maxi = max (aint[nod].maxi, aint[nod * 2].dr + aint[2 * nod + 1].st);
    //int  dbg = 1;
    if (db)
        cout << in <<" " <<  sf <<" " << aint[nod].maxi << "  " << aint[nod].st << " " << aint[nod].dr << "\n";

}
void init (int nod, int a, int b)
{
   aint[nod].st = aint[nod].dr = aint[nod].maxi = b - a + 1;
   if (a == b)
       return;
   int mid = (a + b) / 2;
   init (2 * nod, a, mid);
   init (2 * nod + 1, mid + 1, b);
    
}
int main()
{
    int x, y, n, p;
    ifstream cin ("hotel.in");
    ofstream cout ("hotel.out");
    cin >> n >> p;
    type = 2;
    update (1,1, n, 1 ,n);
    for (int i = 1; i <= p; i++)
    {
        cin >> type;
        if(type == 3)
            cout << aint[1].maxi << "\n";
        else
        {       
            cin >> x >> y;
            update (1, 1, n, x, y + x - 1);
        }
    }
    return 0;
}