Cod sursa(job #1769756)

Utilizator AnaRaduAna-Maria Radu AnaRadu Data 3 octombrie 2016 08:36:21
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <stdio.h>
#define log 18
#define inf 2000000000
struct elem{int suf,pref,secv;};
elem aint[1<<log];
int val;
int x,y;
int maxim(int a,int b){
    if(a>b)
        return a;
    else
        return b;
}
void reset(int nod,int nr){
    aint[nod].suf=nr;
    aint[nod].pref=nr;
    aint[nod].secv=nr;
}
void update(int nod,int st,int dr){
    //update pe intervalul [x,y]
    if(x<=st&&dr<=y){
        if(val==1)
            reset(nod,dr-st+1);
        else
            reset(nod,0);
    }
    else{
        int mij=(st+dr)/2;
        if(aint[nod].secv==0){
            reset(2*nod,0);
            reset(2*nod+1,0);
        }
        if(aint[nod].secv==dr-st+1){
            reset(2*nod,mij-st+1);
            reset(2*nod+1,dr-mij);
        }
        if(x<=mij)
            update(2*nod,st,mij);
        if(mij<y)
            update(2*nod+1,mij+1,dr);
        aint[nod].secv=maxim(aint[2*nod].suf+aint[2*nod+1].pref,maxim(aint[2*nod].secv,aint[2*nod+1].secv));
        if(aint[2*nod].pref==mij-st+1)
            aint[nod].pref=aint[2*nod].pref+aint[2*nod+1].pref;
        else
            aint[nod].pref=aint[2*nod].pref;
        if(aint[2*nod+1].suf==dr-mij)
            aint[nod].suf=aint[2*nod].suf+aint[2*nod+1].suf;
        else
            aint[nod].suf=aint[2*nod+1].suf;
    }
}
int main(){
    FILE *fin,*fout;
    fin=fopen("hotel.in","r");
    fout=fopen("hotel.out","w");
    int i,n,m,cer;
    fscanf(fin,"%d",&n);
    for(i=1;i<=n;i++){
        val=1;
        x=i;
        y=i;
        update(1,1,n);
    }
    fscanf(fin,"%d",&m);
    for(i=1;i<=m;i++){
        fscanf(fin,"%d",&cer);
        if(cer==1){
            fscanf(fin,"%d%d",&x,&y);
            val=0;
            y=y+x-1;
            update(1,1,n);
        }
        if(cer==2){
            fscanf(fin,"%d%d",&x,&y);
            val=1;
            y=y+x-1;
            update(1,1,n);
        }
        if(cer==3)
            fprintf(fout,"%d\n",aint[1].secv);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}