Cod sursa(job #1768009)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 30 septembrie 2016 00:11:50
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.49 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXN 200000

#define BUF_SIZE 16384
char buf[BUF_SIZE];
int pbuf=BUF_SIZE;
FILE*fi,*fo;
inline char nextch(){
    if(pbuf==BUF_SIZE){
        fread(buf, BUF_SIZE, 1, fi);
        pbuf=0;
    }
    return buf[pbuf++];
}
inline long long nextnum(){
    long long a=0;
    char c=nextch();
    while((c<'0' || c>'9') && c!='-')
        c=nextch();
    int semn=1;
    if(c=='-'){
        semn=-1;
        c=nextch();
    }
    while('0'<=c && c<='9'){
        a=a*10+c-'0';
        c=nextch();
    }
    return a*semn;
}

long long w[MAXN+1];
struct FraxinusPennsylvanicaVarSubintegerrima{
    long long suff, pref, len, num;
    long long lazy;
} v[4*MAXN];///pentru persoanele curioase, care nu ar trebui sa imi citeasca sursa, aista ii nume de pom, sau cum le place unora sa zica, arbore de intervale

inline long long maxim(long long a, long long b){
    return a > b ? a : b;
}
inline long long maxim3(long long a, long long b, long long c){
    if(a>maxim(b, c))
        return a;
    return b > c ? b : c;
}

inline FraxinusPennsylvanicaVarSubintegerrima lazySeDuce(FraxinusPennsylvanicaVarSubintegerrima p){
    if(p.lazy==2)//plin
        p.pref=p.suff=p.num=0;
    else if(p.lazy==1)//gol
        p.pref=p.suff=p.num=p.len;
    return p;
}

void parcurgere(int p, int st, int dr){
    if(st==dr){
        v[p].suff=v[p].pref=v[p].num=v[p].len=1;
        v[p].lazy=0;
    }
    else{
        parcurgere(2*p, st, (st+dr)/2);
        parcurgere(2*p+1, (st+dr)/2+1, dr);
        v[p].len=v[2*p].len+v[2*p+1].len;
        if(v[2*p].len=v[2*p].num) v[p].pref=v[2*p].len+v[2*p+1].pref;
        else v[p].pref=v[2*p].pref;

        if(v[2*p+1].len=v[2*p+1].num) v[p].suff=v[2*p+1].len+v[2*p].suff;
        else v[p].suff=v[2*p+1].suff;
        v[p].num=maxim3(v[p].pref, v[p].suff, v[2*p].suff+v[2*p+1].pref);
        v[p].lazy=0;
    }
}

int left, right;
long long val;
void update(int p, int st, int dr){
    if(left<=st && dr<=right){
        v[p].lazy=val;
        v[p]=lazySeDuce(v[p]);
    }
    else{
        int m=(st+dr)/2;
        if(v[p].lazy>0){
            v[2*p].lazy=v[2*p+1].lazy=v[p].lazy;
            v[2*p]=lazySeDuce(v[2*p]);
            v[2*p+1]=lazySeDuce(v[2*p+1]);
            v[p].lazy=0;
        }
        if(left<=m) update(2*p, st, m);
        if(m<right) update(2*p+1, m+1, dr);

        FraxinusPennsylvanicaVarSubintegerrima q=lazySeDuce(v[2*p]), r=lazySeDuce(v[2*p+1]);
        v[p].len=q.len+r.len;
        if(q.len==q.num) v[p].pref=q.len+r.pref;
        else v[p].pref=q.pref;

        if(r.len==r.num) v[p].suff=r.len+q.suff;
        else v[p].suff=r.suff;
        v[p].num=maxim3(v[p].pref, v[p].suff, q.suff+r.pref);
        v[p].lazy=0;
    }
}

int main(){
    fi=fopen("hotel.in","r");
    fo=fopen("hotel.out","w");
    int n=nextnum(), p=nextnum();
    parcurgere(1, 1, n);
    for(int i=0;i<p;i++){
        int c=nextnum();
        if(c==1){
            left=nextnum();
            right=nextnum();
            right=left+right-1;
            val=2;
            update(1, 1, n);
        }
        else if(c==2){
            left=nextnum();
            right=nextnum();
            right=left+right-1;
            val=1;
            update(1, 1, n);
        }
        else{
            FraxinusPennsylvanicaVarSubintegerrima a=lazySeDuce(v[1]);
            fprintf(fo,"%lld\n", a.num);
        }
    }
    fclose(fi);
    fclose(fo);
    return 0;
}