Cod sursa(job #1294387)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 17 decembrie 2014 15:09:15
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>
#define DIM 100011
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
int n,m,P,nr;

struct arbore{
    int v,st,dr;
} A[4*DIM-1];

void built(int nod,int p,int u){
    if(p==u){
        A[nod].v=A[nod].st=A[nod].dr=1;
        return;
    }
    int mid=p+(u-p)/2;
    built(2*nod,p,mid);
    built(2*nod+1,mid+1,u);
    A[nod].v=A[nod].st=A[nod].dr=A[2*nod+1].v+A[2*nod].v;
}

void update(int nod,int p,int u,int a,int b){
    if(a<=p && u<=b){
        if(nr==1)
            A[nod].v=A[nod].st=A[nod].dr=0;
        else
            A[nod].v=A[nod].st=A[nod].dr=u-p+1;
        return;
    }
    int mid=p+(u-p)/2;
    if(A[nod].v==0){
        A[2*nod].v=A[2*nod].st=A[2*nod].dr=0;
        A[2*nod+1].v=A[2*nod+1].st=A[2*nod+1].dr=0;
    }
    else if(A[nod].v==u-p+1){
        A[2*nod].v=A[2*nod].st=A[2*nod].dr=mid-p+1;
        A[2*nod+1].v=A[2*nod+1].st=A[2*nod+1].dr=u-mid;
    }

    if(a<=mid)
        update(2*nod,p,mid,a,b);
    if(b>mid)
        update(2*nod+1,mid+1,u,a,b);
    A[nod].v=max(A[2*nod].v,A[2*nod+1].v);
    A[nod].v=max(A[nod].v,A[2*nod].dr+A[2*nod+1].st);
    A[nod].st=A[2*nod].st;
    A[nod].dr=A[2*nod+1].dr;
    if(A[2*nod].st==mid-p+1)
        A[nod].st+=A[2*nod+1].st;
    if(A[2*nod+1].dr==u-mid)
        A[nod].dr+=A[2*nod].dr;
}

int main(void){
    register int i,j,t,x;

    f>>n>>P;
    built(1,1,n);
    for(;P;P--){
        f>>t;
        if(t==1){
            f>>i>>m;
            nr=1;
            update(1,1,n,i,i+m-1);
        }
        else if(t==2){
            f>>i>>m;
            nr=-1;
            update(1,1,n,i,i+m-1);
        }
        else{
            g<<A[1].v<<"\n";
        }
    }
    return 0;
}