Cod sursa(job #53764)

Utilizator mariusdrgdragus marius mariusdrg Data 23 aprilie 2007 10:35:39
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.17 kb
#include<stdio.h>


const int maxn = 262144 + 1;


int st[maxn];
int end[maxn];
int lim;
int i;
int j;
int n;
int p;
int x;
int mark[maxn];
int maxis[maxn];
int maxid[maxn];
int maxim[maxn];
int sta;
int en;

int max(int a, int b)
{
        if (a < b) return b;
        return a;
}


void update2(int beg,int fin,int nod)
{

        int mid =  (st[nod] + end[nod]) / 2;
        if (beg == st[nod] && fin == end[nod])
        {

                if (x == 1)
                {
                        mark[nod] = 0;
                        maxis[nod] = 0;
                        maxid[nod] = 0;
                        maxim[nod] = 0;
                }
                else
                {
                        maxis[nod] = fin - beg + 1;
                        maxid[nod] = fin - beg + 1;
                        maxim[nod] = fin - beg + 1;
                        mark[nod] = 1;
                }
                return ;
        }

        if (mark[nod] == 0)
        {
                maxim[nod * 2 + 1] = 0;
                maxis[nod * 2 + 1] = 0;
                maxid[nod * 2 + 1] = 0;
                maxim[nod * 2] = 0;
                maxis[nod * 2] = 0;
                maxid[nod * 2] = 0;
                mark[nod * 2 + 1] = 0;
                mark[nod * 2] = 0;
        }
        if (mark[nod] == 1)
        {

                if ( st[nod * 2] != 0 && nod * 2 <= lim)
                {
                        maxim[nod * 2] = end[nod * 2] - st[nod * 2] + 1;
                        maxis[nod * 2] = end[nod * 2] - st[nod * 2] + 1;
                        maxid[nod * 2] = end[nod * 2] - st[nod * 2] + 1;
                        mark[nod * 2] = 1;
                }
                if (st[nod * 2 + 1] != 0 && nod * 2 + 1 <= lim)
                {
                        maxim[nod * 2 + 1] = end[nod * 2 + 1] - st[nod * 2 + 1] + 1;
                        maxis[nod * 2 + 1] = end[nod * 2 + 1] - st[nod * 2 + 1] + 1;
                        maxid[nod * 2 + 1] = end[nod * 2 + 1] - st[nod * 2 + 1] + 1;
                        mark[nod * 2 + 1] = 1;
                }
        }
        
        
        if (mid < beg)
        {
                update2(beg,fin,nod * 2 + 1);
        }
        if (mid >= fin)  update2(beg,fin,nod * 2);
        if (mid >= beg && mid < fin)
        {
                update2(beg,mid,nod * 2);
                update2(mid + 1,fin,nod * 2 + 1);
        }
        if (mark[nod * 2 + 1] != mark[nod * 2]) mark[nod]  = 2;
                else  mark[nod] = mark[nod * 2];
        maxim[nod] = max(maxid[nod * 2] + maxis[nod * 2 + 1], max(maxim[nod * 2],maxim[nod * 2 + 1]));
        maxis[nod] = maxis[nod * 2];
        if (maxis[nod * 2] == end[nod * 2] - st[nod * 2] + 1) maxis[nod] += maxis[nod * 2 + 1];
        maxid[nod] = maxid[nod * 2 + 1];
        if (maxid[nod * 2 + 1] == end[nod * 2 + 1] - st[nod * 2 + 1] + 1) maxid[nod] += maxid[nod * 2];
        
}
                              /*
void update(int beg,int fin,int nod)
{
        int mid =  (st[nod] + end[nod]) / 2;
        if (beg == st[nod] && fin == end[nod])
        {
                maxis[nod] = fin - beg + 1;
                maxid[nod] = fin - beg + 1;
                maxim[nod] = fin - beg + 1;
                return ;
        }
        if (mid < beg)
        {
                update(beg,fin,nod * 2 + 1);
        }

        if (mid >= fin)
        {
                update(beg,fin,nod * 2);
        }

        if (mid >= beg && mid < fin)
        {
                update(beg,mid,nod * 2);
                update(mid + 1,fin,nod * 2 + 1);
        }
        maxim[nod] = max(maxid[nod * 2] + maxis[nod * 2 + 1], max(maxim[nod * 2],maxim[nod * 2 + 1]));
        maxis[nod] = maxis[nod * 2];
        if (maxis[nod * 2] == end[nod * 2] - st[nod * 2] + 1) maxis[nod] += maxis[nod * 2 + 1];
        maxid[nod] = maxid[nod * 2 + 1];
        if (maxid[nod * 2 + 1] == end[nod * 2 + 1] - st[nod * 2 + 1] + 1) maxid[nod] += maxid[nod * 2];

}
                                */
int main()
{

        freopen("hotel.in","r",stdin);
        freopen("hotel.out","w",stdout);
        scanf("%d %d",&n,&p);
        for(lim = 1;lim <= 2 * n; lim <<= 1)
        {

        }
        st[1] = 1;
        end[1] = n;

        for(i = 1;i <= lim; ++i)
        {
                if (st[i] != end[i])
                {
                        st[i * 2] = st[i];
                        end[i * 2] = (st[i] + end[i]) / 2;
                        st[i * 2 + 1] = end[i * 2] + 1;
                        end[i * 2 + 1] = end[i];
                }
                maxid[i] = end[i] - st[i] + 1;
                maxis[i] = maxid[i];
                maxim[i] = maxid[i];
                mark[i] = 1;
        }

        for(i = 1;i <= p; ++i)
        {
                scanf("%d",&x);
                if (x == 3) printf("%d\n",maxim[1]);
                if (x == 1)
                {
                        scanf("%d %d",&sta,&en);
                        en += sta - 1;
                        update2(sta,en,1);
                }
                if (x == 2)
                {
                        scanf("%d %d",&sta,&en);
                        en += sta - 1;
                        update2(sta,en,1);
                }
        }

        return 0;
}

//12 4 4 6 10