Cod sursa(job #1523240)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 12 noiembrie 2015 15:10:16
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include<cstdio>
using namespace std;
struct arbint{int best,left,right;};
arbint arb[500000];
int x,y,op;
void build_arbint(int node,int left,int right){
    arb[node].best=arb[node].left=arb[node].right=right-left+1;
    if(left==right)
        return;
    build_arbint(2*node,left,(left+right)/2);
    build_arbint(2*node+1,(left+right)/2+1,right);
}
int maxim(int a,int b){
    if(a<b)
        return b;
    return a;
}
void update(int node,int left,int right){
    int middle=(left+right)/2;
    if(left>y||right<x)
        return;
    if(x<=left&&right<=y){
        if(op==1)
            arb[node].best=arb[node].left=arb[node].right=0;
        else
            arb[node].best=arb[node].left=arb[node].right=right-left+1;
        return;
    }
    if(arb[node].best==0)
        arb[2*node].best=arb[2*node].left=arb[2*node].right=arb[2*node+1].best=arb[node*2+1].left=arb[2*node+1].right=0;
    if(arb[node].best==right-left+1){
        arb[2*node].best=arb[2*node].left=arb[2*node].right=middle-left+1;
        arb[2*node+1].best=arb[2*node+1].left=arb[2*node+1].right=right-middle;
    }
    update(2*node,left,middle);
    update(2*node+1,middle+1,right);
    arb[node].best=maxim(maxim(arb[2*node].best,arb[2*node+1].best),arb[2*node].right+arb[2*node+1].left);
    arb[node].left=arb[2*node].left;
    arb[node].right=arb[2*node+1].right;
    if(arb[2*node].left==middle-left+1)
        arb[node].left+=arb[2*node+1].left;
    if(arb[2*node+1].right==right-middle)
        arb[node].right+=arb[2*node].right;
}
int main(){
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    int n,t,q,l;
    scanf("%d%d",&n,&t);
    build_arbint(1,1,n);
    for(q=1;q<=t;q++){
        scanf("%d",&op);
        if(op==1){
            scanf("%d%d",&x,&l);
            y=x+l-1;
            update(1,1,n);
        }
        if(op==2){
            scanf("%d%d",&x,&l);
            y=x+l-1;
            update(1,1,n);
        }
        if(op==3)
            printf("%d\n",arb[1].best);
    }
    return 0;
}