Cod sursa(job #1889710)

Utilizator tqmiSzasz Tamas tqmi Data 22 februarie 2017 20:53:24
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.63 kb
#include <iostream>
#include <fstream>
#define Nmax 300000
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
struct Adi
{
    int max_l,max_ll,max_lr,sum;
};

Adi AI[Nmax];
int N,P;
void Build(int Nod,int L,int R)
{
    int mid=(L+R)/2;
    AI[Nod].max_l=R-L+1;
    AI[Nod].max_ll=AI[Nod].max_l;
    AI[Nod].max_lr=AI[Nod].max_l;
    AI[Nod].sum=AI[Nod].max_l;
    if(L==R)
        return;
    int son1=Nod*2,son2=Nod*2+1;
    Build(son1,L,mid);
    Build(son2,mid+1,R);
}

void Up1(int Nod,int L,int R,int lm,int rm)
{
    int mid=(L+R)/2;
    if(L>=lm && R<=rm)
    {
        AI[Nod].max_l=0;
        AI[Nod].max_ll=0;
        AI[Nod].max_lr=0;
        return;
    }
    int son1=Nod*2,son2=Nod*2+1;
    if(AI[Nod].max_l==AI[Nod].sum)
    {
        AI[son1].max_l=AI[son1].max_ll=AI[son1].max_lr=AI[son1].sum;
        AI[son2].max_l=AI[son2].max_ll=AI[son2].max_lr=AI[son2].sum;
    }
    if(lm<=mid)
        Up1(son1,L,mid,lm,rm);
    if(rm>mid)
        Up1(son2,mid+1,R,lm,rm);
    AI[Nod].max_l=max(AI[son1].max_l,max(AI[son2].max_l,AI[son1].max_lr+AI[son2].max_ll));
    AI[Nod].max_ll=AI[son1].max_ll;
    if(AI[Nod].max_ll==AI[son1].sum)
        AI[Nod].max_ll+=AI[son2].max_ll;
    AI[Nod].max_lr=AI[son2].max_lr;
    if(AI[Nod].max_lr==AI[son2].sum)
        AI[Nod].max_lr+=AI[son1].max_lr;
}

void Up2(int Nod,int L,int R,int lm,int rm)
{
    int mid=(L+R)/2;
    if(L>=lm && R<=rm)
    {
        AI[Nod].max_l=AI[Nod].sum;
        AI[Nod].max_ll=AI[Nod].sum;
        AI[Nod].max_lr=AI[Nod].sum;
        return;
    }
    int son1=Nod*2,son2=Nod*2+1;
    if(AI[Nod].max_l==0)
    {
        AI[son1].max_l=AI[son1].max_ll=AI[son1].max_lr=0;
        AI[son2].max_l=AI[son2].max_ll=AI[son2].max_lr=0;
    }
    if(lm<=mid)
        Up2(son1,L,mid,lm,rm);
    if(rm>mid)
        Up2(son2,mid+1,R,lm,rm);
    AI[Nod].max_l=max(AI[son1].max_l,max(AI[son2].max_l,AI[son1].max_lr+AI[son2].max_ll));
    AI[Nod].max_ll=AI[son1].max_ll;
    if(AI[Nod].max_ll==AI[son1].sum)
        AI[Nod].max_ll+=AI[son2].max_ll;
    AI[Nod].max_lr=AI[son2].max_lr;
    if(AI[Nod].max_lr==AI[son2].sum)
        AI[Nod].max_lr+=AI[son1].max_lr;
}
int main()
{
    fin>>N>>P;
    Build(1,1,N);
    for(int i=1;i<=P;i++)
    {
        int c,x,y;
        fin>>c;
        switch(c)
        {
        case 1:
            fin>>x>>y;
            Up1(1,1,N,x,x+y-1);
            break;
        case 2:
            fin>>x>>y;
            Up2(1,1,N,x,x+y-1);
            break;
        case 3:
            fout<<AI[1].max_l<<"\n";
            break;
        }
    }
    return 0;
}