Cod sursa(job #548755)

Utilizator david_raucaRauca Ioan David david_rauca Data 7 martie 2011 19:22:25
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#include<fstream>
#include<vector>
using namespace std;
 
ifstream fin("hotel.in");
ofstream fout("hotel.out");
 
int n, m, start, finish, v;

int a[400001], b[400001], c[400001];
 
void Read();
void Initializare(int nod, int st, int dr );
void Update(int nod, int st, int dr );
 
int main()
{
    Read();
     
    fin.close();
    fout.close();
     
    return 0;
}
 
void Read()
{
    fin >> n >> m;
    
    int x, y, t;
    Initializare(1, 1, n );
    for( int i = 1; i <= m; ++i )
    {
        fin >> t;
        if( t == 1 )
        {
            fin >> x >> y;
            v = 0;
            start = x;
            finish = x+y-1;
            Update( 1, 1, n );
        }
        if( t == 2 )
        {
            fin >> x >> y;
            v = 1;
            start = x;
            finish = x+y-1;
            Update(1, 1, n);
        }
        if( t == 3 )
                fout << a[1] << '\n';
    }
}
 
void Update(int nod, int st, int dr )
{
    if( st == dr )
    {
        a[nod] = v;
        b[nod] = v;
        c[nod] = v;
        return;
    }
     
    int mij = (st+dr) >> 1;
     
    int stnod = (nod << 1);
    int drnod = stnod + 1;
     
    if( start <= mij )
        Update( stnod, st, mij );
    if( finish > mij )
        Update( drnod, mij+1, dr );
     
    //b[nod] = b[stnod];
    //c[nod] = c[drnod];
     
    if( b[stnod] == (dr - st + 1)- (dr - mij) )
        b[nod] = b[stnod] + b[drnod];
    else
        b[nod] = b[stnod];
     
    if( b[drnod] == dr - mij )
        c[nod] = c[stnod] + b[drnod];
    else
        c[nod] = c[drnod];
     
    a[nod] = max( max( c[stnod] + b[drnod], max( a[stnod], a[drnod] ) ) , max( b[nod], c[nod] ) );
    /* 
    if( a[nod] < b[nod] )
        a[nod] = b[nod];
     
    if( a[nod] < c[nod] )
        a[nod] = c[nod];
    
    if( a[nod] < c[stnod] + b[drnod] )
        a[nod] = c[stnod] + b[drnod];
        */
}

void Initializare( int nod, int st, int dr )
{
    if( st == dr )
    {
        a[nod] = 1;
        b[nod] = 1;
        c[nod] = 1;
        return;
    }
     
    int mij = (st+dr)/2;
    int stnod = (nod << 1);
    int drnod = stnod + 1;
    Initializare( stnod, st, mij );
    Initializare( drnod, mij+1, dr );
     
    a[nod] = b[nod] = c[nod] = a[stnod] + a[drnod];
}