Cod sursa(job #1308927)

Utilizator rangerChihai Mihai ranger Data 4 ianuarie 2015 21:22:33
Problema Hotel Scor 60
Compilator cpp Status done
Runda tema_pentru_vacanta Marime 1.76 kb
#include<fstream>
#include<algorithm>
using namespace std;

const int N = 100003;
struct data{ int pre,suf,sum;} tree[N];
int n,m,i,op,x,y;

void build(int k,int l, int r)
{
    if (l==r) tree[k].sum=tree[k].suf=tree[k].pre=1;
    else{
            int mij=(l+r)/2;
        build(2*k,l,mij);
        build(2*k+1,mij+1,r);
        tree[k].sum=tree[k].suf=tree[k].pre=tree[2*k].sum+tree[2*k+1].sum;
    }
}

void push(int k,int L, int R)
{   int m=(L+R)/2;
    if (tree[k].sum==R-L+1){
        tree[2*k].sum=tree[2*k].pre=tree[2*k].suf=m-L+1;
        tree[2*k+1].sum=tree[2*k+1].pre=tree[2*k+1].suf=R-m;
    } else
    if (tree[k].sum==0)
       tree[2*k].sum=tree[2*k].pre=tree[2*k].suf =
       tree[2*k+1].sum=tree[2*k+1].pre=tree[2*k+1].suf = 0;
}

void update(int k, int L, int R, int l, int r, int val)
{
    if (l==L && r==R){
        tree[k].sum=tree[k].pre=tree[k].suf=(r-l+1)*val;
        return ;
    }
    int mij=(L+R)/2;
    push(k,L,R);
    if (r<=mij) update(2*k,L,mij,l,r,val); else
        if (l>mij) update(2*k+1,mij+1,R,l,r,val);
    else{
        update(2*k,L,mij,l,mij,val);
        update(2*k+1,mij+1,R,mij+1,r,val);
    }
    tree[k].sum=max(max(tree[2*k].sum,tree[2*k+1].sum),tree[2*k].suf+tree[2*k+1].pre);
    tree[k].pre=tree[2*k].pre;
    if (tree[2*k].sum==mij-L+1)tree[k].pre+=tree[2*k+1].pre;
    tree[k].suf=tree[2*k+1].suf;
    if (tree[2*k+1].sum==R-mij)tree[k].suf+=tree[2*k].suf;
}

int main()
{
    ifstream cin("hotel.in");
    ofstream cout("hotel.out");

    cin>>n>>m;
    build(1,1,n);
    while (m--)
    {
        cin>>op;
        if (op==3)
            cout<<tree[1].sum<<"\n";
        else{
            cin>>x>>y;
            update(1,1,n,x,x+y-1,!(op%2));
        }
    }
    return 0;
}