Cod sursa(job #917629)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 18 martie 2013 10:36:10
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <fstream>
#define MAX 8*100000
using namespace std;
int n, q, x, y, t, L[MAX], R[MAX], arb[MAX], lazy[MAX];
void build(int nod, int l, int r)
{
L[nod] = R[nod] = arb[nod] = r - l + 1;
if(l == r) return;
int m = (l+r)/2;
build(2*nod, l, m);
build(2*nod+1, m+1, r);
}
void checkout(int nod, int l, int r, int p)
{
if(lazy[nod] and !p)
{
p = lazy[nod];
lazy[nod] = 0;
} else lazy[nod] = 0;
if(p == 1)
{
L[nod] = R[nod] = arb[nod] = 0;
L[2*nod] = R[2*nod] = arb[2*nod] = 0;
L[2*nod+1] = R[2*nod+1] = arb[2*nod+1] = 0;
lazy[2*nod] = lazy[2*nod+1] = p;
}
else if(p == 2)
{
L[nod] = R[nod] = arb[nod] = r - l + 1;
L[2*nod] = R[2*nod] = arb[2*nod] = r - l + 1;
L[2*nod+1] = R[2*nod+1] = arb[2*nod+1] = r - l + 1;
lazy[2*nod] = lazy[2*nod+1] = p;
}
if(x <= l and y >= r)
{
L[nod] = R[nod] = arb[nod] = r - l + 1;
lazy[nod] = 2;
return;
}
int m = (l+r)/2;
if(x <= m) checkout(2*nod, l, m, p); //se poate schimba L
if(y > m) checkout(2*nod+1, m+1, r, p); //se poate schimba R
L[nod] = L[2*nod]; R[nod] = R[2*nod+1];
if(L[nod] == m - l + 1) L[nod] = L[2*nod] + L[2*nod+1];
if(R[nod] == r - m) R[nod] = R[2*nod] + R[2*nod+1];
arb[nod] = max(arb[2*nod], arb[2*nod+1]);
arb[nod] = max(arb[nod], L[2*nod+1]+R[2*nod]);
}
void checkin(int nod, int l, int r, int p)
{
int m = (l+r)/2;
if(lazy[nod] and !p)
{
p = lazy[nod];
lazy[nod] = 0;
} else lazy[nod] = 0;
if(p == 1)
{
L[nod] = R[nod] = arb[nod] = 0;
L[2*nod] = R[2*nod] = arb[2*nod] = 0;
L[2*nod+1] = R[2*nod+1] = arb[2*nod+1] = 0;
lazy[2*nod] = lazy[2*nod+1] = p;
}
else if(p == 2)
{
L[nod] = R[nod] = arb[nod] = r - l + 1;
L[2*nod] = R[2*nod] = arb[2*nod] = m - l + 1;
L[2*nod+1] = R[2*nod+1] = arb[2*nod+1] = r - m;
lazy[2*nod] = lazy[2*nod+1] = p;
}
if(x <= l and y >= r)
{
L[nod] = R[nod] = arb[nod] = 0;
lazy[nod] = 1;
return;
}
if(x <= m) checkin(2*nod, l, m, p); //se poate schimba L
if(y > m) checkin(2*nod+1, m+1, r, p); //se poate schimba R
L[nod] = L[2*nod]; R[nod] = R[2*nod+1];
if(L[nod] == m - l + 1) L[nod] = L[2*nod] + L[2*nod+1];
if(R[nod] == r - m) R[nod] = R[2*nod] + R[2*nod+1];
arb[nod] = max(arb[2*nod], arb[2*nod+1]);
arb[nod] = max(arb[nod], L[2*nod+1]+R[2*nod]);
}
int main()
{
ifstream fi("hotel.in");
ofstream fo("hotel.out");
fi >> n >> q;
build(1, 1, n);
while(q--)
{
fi >> t;
if(t != 3)
{
fi >> x >> y;
y += x - 1;
if(t == 1) checkin(1, 1, n, 0);
if(t == 2) checkout(1, 1, n, 0);
}
else fo << arb[1] << "\n";
}
return 0;
}