Cod sursa(job #1384357)

Utilizator cojocarugabiReality cojocarugabi Data 11 martie 2015 01:17:19
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
# include <bits/stdc++.h>
# define max(a,b,c) max(max(a,b),c)
using namespace std;
ifstream fi("hotel.in");
ofstream fo("hotel.out");
const int nmax = 1e5 + 5;
struct arb
{
    int ans,pr,su;
} s[nmax<<2];
void init(int nod,int val)
{
    s[nod].ans = s[nod].pr = s[nod].su = val;
}
void update(int p,int u,int st,int dr,int nod,int type)
{
    if (p > u) return;
    if (st <= p && u <= dr) {if (type == 2) init(nod,u - p + 1);else init(nod,0);}
    else
    {
        int m = (p + u) >> 1;
        if (!s[nod].ans) init(nod<<1,0),init((nod<<1)+1,0);
        if (s[nod].ans == u - p + 1) init(nod<<1,m - p + 1),init((nod<<1)+1,u-m);
        if (st <= m) update(p,m,st,dr,nod<<1,type);
        if (m  < dr) update(m+1,u,st,dr,(nod<<1)+1,type);
        s[nod].ans = max(s[nod<<1].ans,s[(nod<<1)+1].ans,s[nod<<1].su + s[(nod<<1)+1].pr);
        s[nod].pr = s[(nod<<1)].pr;if (s[nod].pr == m - p + 1) s[nod].pr += s[(nod<<1)+1].pr;
        s[nod].su = s[(nod<<1)+1].su;if (s[nod].su == u - m) s[nod].su += s[nod<<1].su;
    }
}
int main(void)
{
    int n,m;
    fi>>n>>m;
    update(1,n,1,n,1,2);
    int ok,x,y;
    while (m --)
    {
        fi>>ok;
        if (ok < 3) fi>>x>>y,y+=x-1,update(1,n,x,y,1,ok);else fo << s[1].ans << '\n';
    }
    return 0;
}