Cod sursa(job #1263718)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 15 noiembrie 2014 01:44:46
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.96 kb
#include <fstream>
#define NMAX 100005
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int N,P;
int Sum[8*NMAX],SumA[8*NMAX],SumB[8*NMAX],Lazy[8*NMAX];
void Build(int K,int L,int R)
{
    if(L>R)
        return;
    if(L==R)
    {
        Sum[K]=SumA[K]=SumB[K]=1;
        return;
    }
    Build(K*2,L,(L+R)/2);
    Build(K*2+1,(L+R)/2+1,R);
    Sum[K]=Sum[K*2]+Sum[K*2+1];
    SumA[K]=SumB[K]=Sum[K];
}
void Insert(int K,int L,int R,int x,int y)
{
    int node=K;
    if(Lazy[node]==0)
    {
        Sum[node*2]=0;Sum[node*2+1]=0;
        SumA[node*2]=0;SumB[node*2]=0;SumA[node*2+1]=0;SumB[node*2+1]=0;
        Lazy[node*2]=Lazy[node*2+1]=0;
        Lazy[node]=-1;
    }
    if(Lazy[node]==1)
    {
        Sum[node*2]=SumA[node*2]=SumB[node*2]=(L+R)/2-L+1;
        Sum[node*2+1]=SumA[node*2+1]=SumB[node*2+1]=R-(L+R)/2;
        Lazy[node*2]=Lazy[node*2+1]=1;
        Lazy[node]=-1;
    }
    if(L>R || L>y || R<x)
        return;
    if(x<=L && R<=y)
    {
        Sum[K]=0;
        SumA[K]=0;
        SumB[K]=0;
        Lazy[node]=0;
        return;
    }

    Insert(2*K,L,(L+R)/2,x,y);
    Insert(2*K+1,(L+R)/2+1,R,x,y);
    Sum[K]=max(Sum[K*2],Sum[K*2+1]);
    Sum[K]=max(Sum[K],SumB[K*2]+SumA[K*2+1]);
    if(Sum[K*2]==(L+R)/2-L+1)
        SumA[K]=Sum[K*2]+SumA[K*2+1];
    else
        SumA[K]=SumA[K*2];
    if(Sum[K*2+1]==R-(L+R)/2)
        SumB[K]=Sum[K*2+1]+SumB[K*2];
    else
        SumB[K]=SumB[K*2+1];
}
void Erase(int K,int L,int R,int x,int y)
{
    int node=K;
    if(Lazy[node]==0)
    {
        Sum[node*2]=0;Sum[node*2+1]=0;
        SumA[node*2]=0;SumB[node*2]=0;SumA[node*2+1]=0;SumB[node*2+1]=0;
        Lazy[node*2]=Lazy[node*2+1]=0;
        Lazy[node]=-1;
    }
    if(Lazy[node]==1)
    {
        Sum[node*2]=SumA[node*2]=SumB[node*2]=(L+R)/2-L+1;
        Sum[node*2+1]=SumA[node*2+1]=SumB[node*2+1]=R-(L+R)/2;
        Lazy[node*2]=Lazy[node*2+1]=1;
        Lazy[node]=-1;
    }
    if(L>R || L>y || R<x)
        return;

    if(x<=L && R<=y)
    {
        Sum[K]=R-L+1;
        SumA[K]=R-L+1;
        SumB[K]=R-L+1;
        Lazy[node]=1;
        return;
    }

    Erase(2*K,L,(L+R)/2,x,y);
    Erase(2*K+1,(L+R)/2+1,R,x,y);
    Sum[K]=max(Sum[K*2],Sum[K*2+1]);
    Sum[K]=max(Sum[K],SumB[K*2]+SumA[K*2+1]);
    if(Sum[K*2]==(L+R)/2-L+1)
        SumA[K]=Sum[K*2]+SumA[K*2+1];
    else
        SumA[K]=SumA[K*2];
    if(Sum[K*2+1]==R-(L+R)/2)
        SumB[K]=Sum[K*2+1]+SumB[K*2];
    else
        SumB[K]=SumB[K*2+1];
}
int main()
{
    f>>N>>P;
    Build(1,1,N);
    for(int i=1;i<=4*N;i++)
        Lazy[i]=-1;
    for(int i=1;i<=P;i++)
    {
        int type,a,b;
        f>>type;
        if(type==1)
        {
            f>>a>>b;
            Insert(1,1,N,a,a+b-1);
        }
        if(type==2)
        {
            f>>a>>b;
            Erase(1,1,N,a,a+b-1);
        }
        if(type==3)
            g<<Sum[1]<<"\n";
    }
    return 0;
}