Pagini recente » Cod sursa (job #1151518) | Cod sursa (job #1082538) | Cod sursa (job #2629158) | Cod sursa (job #1044249) | Cod sursa (job #735358)
Cod sursa(job #735358)
#include<iostream>
#include<fstream>
using namespace std;
struct arb {
int val,c,st,dr;
};
arb v[400001];
int a,b,j;
void construieste(int nod, int st, int dr)
{
int mij;
if(st==dr) {
v[nod].c=2;
v[nod].val=1;
v[nod].st=1;
v[nod].dr=1;
return;
}
mij=(st+dr)/2;
construieste(nod*2,st,mij);
construieste(nod*2+1,mij+1,dr);
v[nod].c=2;
v[nod].val=dr-st+1;
v[nod].st=dr-st+1;
v[nod].dr=dr-st+1;
}
void update1(int nod, int st, int dr)
{
int mij;
if((a<=st)&&(dr<=b)) {
v[nod].c=1;
v[nod].val=0;
v[nod].st=0;
v[nod].dr=0;
return;
}
mij=(st+dr)/2;
if(v[nod].c==1) {
v[nod*2].c=1;
v[nod*2].val=0;
v[nod*2].st=0;
v[nod*2].dr=0;
v[nod*2+1].c=1;
v[nod*2+1].val=0;
v[nod*2+1].st=0;
v[nod*2+1].dr=0;
}
else if(v[nod].c==0) {
v[nod*2].c=0;
v[nod*2].val=mij-st+1;
v[nod*2].st=mij-st+1;
v[nod*2].dr=mij-st+1;
v[nod*2+1].c=1;
v[nod*2+1].val=dr-mij;
v[nod*2+1].st=dr-mij;
v[nod*2+1].dr=dr-mij;
}
v[nod].c=2;
if(a<=mij)
update1(nod*2,st,mij);
if(mij<b)
update1(nod*2+1,mij+1,dr);
v[nod].val=v[nod*2].val;
if(v[nod].val<v[nod*2+1].val)
v[nod].val=v[nod*2+1].val;
if(v[nod].val<v[nod*2].dr+v[nod*2+1].st)
v[nod].val=v[nod*2].dr+v[nod*2+1].st;
if(v[nod*2].st) {
v[nod].st=v[nod*2].st;
if((mij-st+1)==v[nod*2].st)
v[nod].st=v[nod].st+v[nod*2+1].st;
}
else v[nod].st=0;
if(v[nod*2+1].dr) {
v[nod].dr=v[nod*2+1].dr;
if((dr-mij)==v[nod*2+1].dr)
v[nod].dr=v[nod].dr+v[nod*2].dr;
}
else v[nod].dr=0;;
}
void update(int nod, int st, int dr)
{
int mij;
if((a<=st)&&(dr<=b)) {
v[nod].c=0;
v[nod].val=dr-st+1;
v[nod].st=dr-st+1;
v[nod].dr=dr-st+1;
return;
}
if(v[nod].c==1) {
v[nod*2].c=1;
v[nod*2].val=0;
v[nod*2].st=0;
v[nod*2].dr=0;
v[nod*2+1].c=1;
v[nod*2+1].val=0;
v[nod*2+1].st=0;
v[nod*2+1].dr=0;
}
else if(v[nod].c==0) {
v[nod*2].c=0;
v[nod*2].val=mij-st+1;
v[nod*2].st=mij-st+1;
v[nod*2].dr=mij-st+1;
v[nod*2+1].c=1;
v[nod*2+1].val=dr-mij;
v[nod*2+1].st=dr-mij;
v[nod*2+1].dr=dr-mij;
}
v[nod].c=2;
mij=(st+dr)/2;
if(a<=mij)
update(nod*2,st,mij);
if(mij<b)
update(nod*2+1,mij+1,dr);
v[nod].val=v[nod*2].val;
if(v[nod].val<v[nod*2+1].val)
v[nod].val=v[nod*2+1].val;
if(v[nod].val<v[nod*2].dr+v[nod*2+1].st)
v[nod].val=v[nod*2].dr+v[nod*2+1].st;
if(v[nod*2].st) {
v[nod].st=v[nod*2].st;
if((mij-st+1)==v[nod*2].st)
v[nod].st=v[nod].st+v[nod*2+1].st;
}
else v[nod].st=0;
if(v[nod*2+1].dr) {
v[nod].dr=v[nod*2+1].dr;
if((dr-mij)==v[nod*2+1].dr)
v[nod].dr=v[nod].dr+v[nod*2].dr;
}
else v[nod].dr=0;
}
int main ()
{
int n,i,p,x,j;
ifstream f("hotel.in");
ofstream g("hotel.out");
f>>n>>p;
construieste(1,1,n);
for(i=1;i<=p;i++) {
f>>x;
if(x==1) {
f>>a>>b;
b=a+b-1;
update1(1,1,n);
}
else if(x==2) {
f>>a>>b;
b=a+b-1;
update(1,1,n);
}
else g<<v[1].val<<'\n';
}
f.close();
g.close();
return 0;
}