Cod sursa(job #2321465)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 16 ianuarie 2019 09:16:55
Problema Hotel Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f ("hotel.in");
ofstream g ("hotel.out");
const int nmax=1e5+3;
int n,q,tip,l,r;
struct
{
    int st,dr,sol,lazy;
}arb[4*nmax];
void lenes(int nod,int a,int b)
{
    arb[nod].st=arb[nod].dr=arb[nod].sol=b-a+1;
    if(a==b)return;
    int mij=(a+b)/2;
    lenes(nod*2,a,mij);
    lenes(nod*2+1,mij+1,b);
}
void propag(int nod,int a,int b)
{
    if(arb[nod].lazy==0) return;
    if(arb[nod].lazy==1) arb[nod].st=arb[nod].dr=arb[nod].sol=0;
    else arb[nod].st=arb[nod].dr=arb[nod].sol=b-a+1;
    if(a<b) arb[2*nod].lazy=arb[2*nod+1].lazy=arb[nod].lazy;
    arb[nod].lazy=0;
}
void update(int nod,int a,int b,int st,int dr,int val)
{
    int mij=(a+b)/2;
    if(st<=a&&b<=dr)
    {
        arb[nod].lazy=val;
        propag(nod,a,b);
        return;
    }
    propag(nod,a,b);
    if(st<=mij) update(nod*2,a,mij,st,dr,val);
    //else propag(nod*2,a,mij);

    if(dr>mij)update(nod*2+1,mij+1,b,st,dr,val);
    //else propag(nod*2+1,mij+1,b);

    arb[nod].sol=max(arb[2*nod].dr+arb[2*nod+1].st,max(arb[2*nod].sol,arb[2*nod+1].sol));

    arb[nod].st=arb[2*nod].st;
    if(arb[nod].st==mij-a+1) arb[nod].st+=arb[2*nod+1].st;

    arb[nod].dr=arb[2*nod+1].dr;
    if(arb[nod].dr==b-mij) arb[nod].dr+=arb[2*nod].dr;
}
int main()
{
    f>>n>>q;
    lenes(1,1,n);
    while(q--)
    {
        f>>tip;
        if(tip==3)
        {
            propag(1,1,n);
            g<<arb[1].sol<<'\n';
        }
        else
        {
            f>>l>>r;
            r+=l-1;
            update(1,1,n,l,r,tip);
        }
    }
    return 0;
}