Cod sursa(job #773274)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 1 august 2012 12:35:20
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
    int l_curr,l_left,l_right,l_max;
} tree[200020];
int n,p,n2,a,b,value,m;
void write()
{
    for(int i=1;i<=2*n2-1;i++) printf("%d ",tree[i]);
    printf("\n");
}
void update()
{
    int node=n2-1+a,i,p;
    for(i=node;i<=node+m-1;i++)
    {
        tree[i].l_curr=value; tree[i].l_left=value; tree[i].l_right=value;
    }
    for(i=n2-1;i>=1;--i)
    {
        p=tree[2*i].l_right+tree[2*i+1].l_left;
        if(tree[2*i].l_max==tree[2*i].l_curr)
        {
            tree[i].l_left=tree[2*i].l_max+tree[2*i+1].l_left;
        }
        else tree[i].l_left=tree[2*i].l_left;
        if(tree[2*i+1].l_max==tree[2*i+1].l_curr)
        {
            tree[i].l_right=tree[2*i+1].l_max+tree[2*i].l_right;
        }
        else tree[i].l_right=tree[2*i+1].l_right;
        tree[i].l_curr=max(max(tree[i].l_right,tree[i].l_left),max(p,max(tree[2*i].l_curr,tree[2*i+1].l_curr)));
    }
}
int main()
{
    int i,q;
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    scanf("%d%d",&n,&p);
    for(n2=1;n2<n;n2<<=1);
    tree[1].l_max=n2; tree[1].l_curr=n;
    for(i=2;i<=2*n2-1;i++) {tree[i].l_max=(tree[i/2].l_max)/2;}
    for(i=n2;i<=n2+n-1;i++) {tree[i].l_curr=1; tree[i].l_left=1; tree[i].l_right=1;}
    for(;p;--p)
    {
        scanf("%d",&q);
        if(q==1) {scanf("%d%d",&i,&m); a=i; b=i+m-1; value=0; update();}
        if(q==2) {scanf("%d%d",&i,&m); a=i; b=i+m-1; value=1; update();}
        if(q==3) {printf("%d\n",tree[1].l_curr);}
    }
    return 0;
}