Cod sursa(job #880448)

Utilizator MagnvsDaniel Constantin Anghel Magnvs Data 16 februarie 2013 19:38:39
Problema Hotel Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <fstream>

using namespace std;

ifstream fin("hotel.in");
ofstream fout("hotel.out");

const int n2max= 131072;

struct itn{
    int l, r, sol;
};

itn t[2*n2max];

void calc_n(int node, int dist)
{
    if (t[2*node].l==dist){
        t[node].l= dist+t[2*node+1].l;
    }else{
        t[node].l= t[2*node].l;
    }
    if (t[2*node+1].r==dist){
        t[node].r= dist+t[2*node].r;
    }else{
        t[node].r= t[2*node+1].r;
    }
    
    t[node].sol= t[node].l;
    if (t[node].sol<t[node].r){
        t[node].sol= t[node].r;
    }
    if (t[node].sol<t[2*node].r+t[2*node+1].l){
        t[node].sol= t[2*node].r+t[2*node+1].l;
    }
    if (t[node].sol<t[2*node].sol){
        t[node].sol= t[2*node].sol;
    }
    if (t[node].sol<t[2*node+1].sol){
        t[node].sol= t[2*node+1].sol;
    }
}

void it_upd(int node, int nl, int nr, int ql, int qr, bool x){
    if (nl>qr|| nr<ql){
        return;
    }else if (nl>=ql&& nr<=qr){
        if (x==1){
            t[node].l= 0; t[node].r= 0; t[node].sol= 0;
        }else{
            t[node].l= nr-nl+1; t[node].r= nr-nl+1; t[node].sol= nr-nl+1;
        }
    }else{
        int dist= (nr-nl+1)/2;
        if (t[node].sol==0){
            t[2*node].l= 0; t[2*node].r= 0; t[2*node].sol= 0;
            t[2*node+1].l= 0; t[2*node+1].r= 0; t[2*node+1].sol= 0;
        }else if (t[node].sol==2*dist){
            t[2*node].l= dist; t[2*node].r= dist; t[2*node].sol= dist;
            t[2*node+1].l= dist; t[2*node+1].r= dist; t[2*node+1].sol= dist;
        }

        it_upd(2*node, nl, (nl+nr)/2, ql, qr, x);
        it_upd(2*node+1, (nl+nr)/2+1, nr, ql, qr, x);
        
        calc_n(node, (nr-nl+1)/2);
        
        printf("%d %d %d %d\n", node, t[node].l, t[node].r, t[node].sol);
    }
}

int main(){
    int n, p;
    fin>>n>>p;
    int n2;
    for (n2= 1; n2<n; n2*= 2){
    }

    for (int i= n2; i<n2+n; ++i){
        t[i].l=1; t[i].r= 1; t[i].sol= 1;
    }
    int dist= 1;
    for (int i= n2-1; i>0; --i){
        calc_n(i, dist);
        if ((i&(i-1))==0){
            dist*= 2;
        }
    }

    for (int i= 1; i<=p; ++i){
        int ot;
        fin>>ot;
        if (ot==1){
            int x, y;
            fin>>x>>y;
            it_upd(1, 1, n2, x, x+y-1, 1);
        }else if (ot==2){
            int x, y;
            fin>>x>>y;
            it_upd(1, 1, n2, x, x+y-1, 0);
        }else{
            fout<<t[1].sol<<"\n";
        }
    }

    return 0;
}