Pagini recente » Cod sursa (job #394442) | Cod sursa (job #1715291) | Cod sursa (job #1483178) | Cod sursa (job #736902) | Cod sursa (job #880448)
Cod sursa(job #880448)
#include <fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
const int n2max= 131072;
struct itn{
int l, r, sol;
};
itn t[2*n2max];
void calc_n(int node, int dist)
{
if (t[2*node].l==dist){
t[node].l= dist+t[2*node+1].l;
}else{
t[node].l= t[2*node].l;
}
if (t[2*node+1].r==dist){
t[node].r= dist+t[2*node].r;
}else{
t[node].r= t[2*node+1].r;
}
t[node].sol= t[node].l;
if (t[node].sol<t[node].r){
t[node].sol= t[node].r;
}
if (t[node].sol<t[2*node].r+t[2*node+1].l){
t[node].sol= t[2*node].r+t[2*node+1].l;
}
if (t[node].sol<t[2*node].sol){
t[node].sol= t[2*node].sol;
}
if (t[node].sol<t[2*node+1].sol){
t[node].sol= t[2*node+1].sol;
}
}
void it_upd(int node, int nl, int nr, int ql, int qr, bool x){
if (nl>qr|| nr<ql){
return;
}else if (nl>=ql&& nr<=qr){
if (x==1){
t[node].l= 0; t[node].r= 0; t[node].sol= 0;
}else{
t[node].l= nr-nl+1; t[node].r= nr-nl+1; t[node].sol= nr-nl+1;
}
}else{
int dist= (nr-nl+1)/2;
if (t[node].sol==0){
t[2*node].l= 0; t[2*node].r= 0; t[2*node].sol= 0;
t[2*node+1].l= 0; t[2*node+1].r= 0; t[2*node+1].sol= 0;
}else if (t[node].sol==2*dist){
t[2*node].l= dist; t[2*node].r= dist; t[2*node].sol= dist;
t[2*node+1].l= dist; t[2*node+1].r= dist; t[2*node+1].sol= dist;
}
it_upd(2*node, nl, (nl+nr)/2, ql, qr, x);
it_upd(2*node+1, (nl+nr)/2+1, nr, ql, qr, x);
calc_n(node, (nr-nl+1)/2);
printf("%d %d %d %d\n", node, t[node].l, t[node].r, t[node].sol);
}
}
int main(){
int n, p;
fin>>n>>p;
int n2;
for (n2= 1; n2<n; n2*= 2){
}
for (int i= n2; i<n2+n; ++i){
t[i].l=1; t[i].r= 1; t[i].sol= 1;
}
int dist= 1;
for (int i= n2-1; i>0; --i){
calc_n(i, dist);
if ((i&(i-1))==0){
dist*= 2;
}
}
for (int i= 1; i<=p; ++i){
int ot;
fin>>ot;
if (ot==1){
int x, y;
fin>>x>>y;
it_upd(1, 1, n2, x, x+y-1, 1);
}else if (ot==2){
int x, y;
fin>>x>>y;
it_upd(1, 1, n2, x, x+y-1, 0);
}else{
fout<<t[1].sol<<"\n";
}
}
return 0;
}