Cod sursa(job #1017235)

Utilizator ShaDoWsiD100Rzv Rzv ShaDoWsiD100 Data 27 octombrie 2013 15:57:24
Problema Hotel Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <fstream>
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int n,v[100001],stanga[100001],dreapta[100001],best[100001],i,c,a,b,q;
void update(int nod,int st,int dr){
    if(st==dr){
        v[nod]=stanga[nod]=dreapta[nod]=best[nod]=1;
        return;}
    int mij=(st+dr)/2;
    update(2*nod,st,mij);
    update(2*nod+1,mij+1,dr);
    v[nod]=stanga[nod]=dreapta[nod]=best[nod]=v[2*nod]+v[2*nod+1];
}
void sosire(int nod,int st,int dr){
    if(a<=st && dr<=b){
        best[nod]=stanga[nod]=dreapta[nod]=0;
        return;}
    if(best[nod]==v[nod]){
        best[2*nod]=stanga[2*nod]=dreapta[2*nod]=v[2*nod];
        best[2*nod+1]=stanga[2*nod+1]=dreapta[2*nod+1]=v[2*nod+1];
    }
    int mij=(st+dr)/2;
    if(a<=mij)
        sosire(2*nod,st,mij);
    if(b>mij)
        sosire(2*nod+1,mij+1,dr);
    best[nod]=max(dreapta[2*nod]+stanga[2*nod+1],max(best[2*nod],best[2*nod+1]));
    if(stanga[2*nod]==v[2*nod])
        stanga[nod]=stanga[2*nod]+stanga[2*nod+1];
    else
        stanga[nod]=stanga[2*nod];
    if(dreapta[2*nod+1]==v[2*nod+1])
        dreapta[nod]=dreapta[2*nod]+dreapta[2*nod+1];
    else
        dreapta[nod]=dreapta[2*nod+1];
}
void plecare(int nod,int st,int dr){
    if(a<=st && dr<=b){
        best[nod]=stanga[nod]=dreapta[nod]=v[nod];
        return;}
    int mij=(st+dr)/2;
    if(best[nod]==0)
        best[2*nod]=stanga[2*nod]=dreapta[2*nod]=best[2*nod+1]=stanga[2*nod+1]=dreapta[2*nod+1]=0;
    if(a<=mij)
        plecare(2*nod,st,mij);
    if(b>mij)
        plecare(2*nod+1,mij+1,dr);
    best[nod]=max(dreapta[2*nod]+stanga[2*nod+1],max(best[2*nod],best[2*nod+1]));
    if(stanga[2*nod]==v[2*nod])
        stanga[nod]=stanga[2*nod]+stanga[2*nod+1];
    else
        stanga[nod]=stanga[2*nod];
    if(dreapta[2*nod+1]==v[2*nod+1])
        dreapta[nod]=dreapta[2*nod]+dreapta[2*nod+1];
    else
        dreapta[nod]=dreapta[2*nod+1];
}
int main()
{
    f>>n>>q;
    update(1,1,n);
    for(i=1;i<=q;i++){
        f>>c;
        if(c==1){
            f>>a>>b;
            b=b+a-1;
            sosire(1,1,n);
        }
        else
        if(c==2){
            f>>a>>b;
            b=b+a-1;
            plecare(1,1,n);
        }
        else
            g<<best[1]<<"\n";
    }
    return 0;
}