Pagini recente » Cod sursa (job #2678727) | Cod sursa (job #3291438) | Cod sursa (job #1598060) | Cod sursa (job #985686) | Cod sursa (job #1060652)
#include <fstream>
using namespace std;
ifstream in("hotel.in");
ofstream out("hotel.out");
int pc, nr, n, p, i;
struct hotel{
int secv;
int prefix;
int sufix;
}t[1<<25];
bool liber, plin;
int maxim(int a, int b, int c){
if(a < b){
if(b < c){
return c;
} else{
return b;
}
} else {
if(a < c){
return c;
} else {
return a;
}
}
}
void ocupa(int p, int st, int dr){
if(liber){
t[p].secv = t[p].prefix = t[p].sufix = dr-st+1;
}
if(pc <= st && dr <= nr){
t[p].secv = t[p].prefix = t[p].sufix = 0;
return;
}
if(dr < pc || st > nr){
return;
}
if(t[p].secv == dr-st+1 && !liber){
liber = true;
ocupa(2*p, st, (st+dr)/2);
ocupa(2*p+1,(st+dr)/2+1, dr);
liber = false;
} else {
ocupa(2*p,st, (st+dr)/2);
ocupa(2*p+1,(st+dr)/2+1, dr);
}
t[p].secv = maxim(t[2*p].secv, t[2*p+1].secv, t[2*p].sufix+t[2*p+1].prefix);
if(t[2*p].prefix == (st+dr)/2-st+1){
t[p].prefix = t[2*p].prefix + t[2*p+1].prefix;
} else {
t[p].prefix = t[2*p].prefix;
}
if(t[2*p+1].sufix==dr-(st+dr)/2){
t[p].sufix=t[2*p].sufix+t[2*p+1].sufix;
} else{
t[p].sufix=t[2*p+1].sufix;
}
}
void elibereaza(int p, int st, int dr){
if(plin){
t[p].secv = t[p].prefix = t[p].sufix = 0;
}
if(pc <= st && dr <= nr){
t[p].secv = t[p].prefix = t[p].sufix = dr-st+1;
return;
}
if(dr < pc || st > nr){
return;
}
if(t[p].secv == plin && !plin){
plin = true;
elibereaza(2*p, st, (st+dr)/2);
elibereaza(2*p+1,(st+dr)/2+1, dr);
plin = false;
} else {
elibereaza(2*p,st, (st+dr)/2);
elibereaza(2*p+1,(st+dr)/2+1, dr);
}
t[p].secv = maxim(t[2*p].secv, t[2*p+1].secv, t[2*p].sufix+t[2*p+1].prefix);
if(t[2*p].prefix == (st+dr)/2-st+1){
t[p].prefix = t[2*p].prefix + t[2*p+1].prefix;
} else {
t[p].prefix = t[2*p].prefix;
}
if(t[2*p+1].sufix==dr-(st+dr)/2){
t[p].sufix=t[2*p].sufix+t[2*p+1].sufix;
} else{
t[p].sufix=t[2*p+1].sufix;
}
}
int main()
{
char type;
in >> n >> p;
t[1].secv = t[1].prefix = t[1].sufix = n;
for(i = 1; i <= p; i++){
in >> type;
if(type == '1'){
in >> pc >> nr;
nr += pc - 1;
ocupa(1,1,n);
} else {
if(type == '2'){
in >> pc >> nr;
nr += pc - 1;
elibereaza(1,1,n);
} else {
out << t[1].secv << "\n";
}
}
}
return 0;
}