Cod sursa(job #1761867)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 22 septembrie 2016 23:57:55
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <cstdio>

using namespace std;

const int N=100005;
struct nod{
    int sum,lazy;
} v[4*N];
int n,maxx,in,sf;

void propagation(int pos, int st, int dr){
    v[2*pos].lazy+=v[pos].lazy;
    v[2*pos+1].lazy+=v[pos].lazy;
    v[2*pos].sum+=((st+dr)/2-st+1)*v[pos].lazy;
    v[2*pos+1].sum+=(dr-(st+dr)/2)*v[pos].lazy;
    v[pos].lazy=0;
}

void update(int pos, int st, int dr, int a, int b, int val){
    if(st>b or dr<a) return;

    if(a<=st and dr<=b){
        v[pos].lazy+=val;
        v[pos].sum+=(dr-st+1)*val;
    }
    if(2*pos+1>4*n){
        v[pos].lazy=0;
        return;
    }

    propagation(pos,st,dr);

    if(a<=st and dr<=b) return;

    update(2*pos, st, (st+dr)/2, a, b, val);
    update(2*pos+1, (st+dr)/2+1, dr, a, b, val);
    v[pos].sum=v[2*pos].sum+v[2*pos+1].sum;
}

void query(int pos, int st, int dr){
    propagation(pos,st,dr);

    if(v[pos].sum==0){
        if(st==sf+1){
            sf=dr;
            return;
        }
        else{
            if((sf-in+1)>maxx) maxx=sf-in+1;
            in=st, sf=dr;
            return;
        }
    }
    else{
        if(st==dr) return;
        query(2*pos, st, (st+dr)/2);
        query(2*pos+1, (st+dr)/2+1, dr);
    }
}

int main(){
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);

    int m,t,i,a,b,dist;
    scanf("%d%d",&n,&m);

    for(i=1;i<=m;i++){
        scanf("%d",&t);
        if(t==1){
            scanf("%d%d",&a,&dist);
            b=a+dist-1;
            update(1,1,n,a,b,1);
        }
        if(t==2){
            scanf("%d%d",&a,&dist);
            b=a+dist-1;
            update(1,1,n,a,b,-1);
        }
        if(t==3){
            maxx=0, in=5, sf=-5;
            query(1,1,n);
            if(sf-in+1>maxx) maxx=sf-in+1;
            printf("%d\n",maxx);
        }

        /*for(int j=1;j<=5;j++) printf("%d ",v[j].sum);
        printf("\n");*/
    }

    return 0;
}