Pagini recente » Cod sursa (job #707473) | Cod sursa (job #1511999) | Cod sursa (job #2943177) | Cod sursa (job #505383) | Cod sursa (job #563182)
Cod sursa(job #563182)
#include<fstream>
#define MAX 262144
using namespace std;
int N,P,l,r,c;
struct bla
{
int l,r,c;
}ARB[MAX];
void init(int nod,int left,int right)
{
ARB[nod].r = ARB[nod].l = ARB[nod].c = right-left+1;
if(left>=right)return;
int mid = (left+right)/2;
init(2*nod,left,mid);
init(2*nod+1,mid+1,right);
}
int maxim(int a,int b,int c)
{
if(a>=b&&a>=c)
return a;
if(b>=c)
return b;
return c;
}
void update(int nod,int left,int right)
{
if(l<=left && right<=r)
{
ARB[nod].l = ARB[nod].r = ARB[nod].c = c*(right-left+1);
return;
}
if(left>=right)return;
if(ARB[nod].c == 0)
{
ARB[nod*2].l = ARB[nod*2].r = ARB[2*nod].c = 0;
ARB[nod*2+1].l = ARB[nod*2+1].r = ARB[nod*2+1].c = 0;
}
int mid = (left + right)/2;
if(ARB[nod].c == right-left+1)
{
ARB[nod*2].l = ARB[nod*2].r = ARB[2*nod].c = mid-left+1;
ARB[nod*2+1].l = ARB[nod*2+1].r = ARB[nod*2+1].c = right-mid;
}
if(l<=mid)
update(2*nod, left, mid);
if(mid<r)
update(2*nod+1, mid+1, right);
ARB[nod].l = ARB[nod*2].l;
if(ARB[nod*2].l == mid-left+1)
ARB[nod].l+=ARB[nod*2+1].l;
ARB[nod].r = ARB[nod*2+1].r;
if(ARB[nod*2+1].r == right-mid)
ARB[nod].r+=ARB[nod*2].r;
ARB[nod].c = maxim(ARB[nod*2].c, ARB[nod*2+1].c, ARB[nod*2].r + ARB[nod*2+1].l);
}
int main()
{
ifstream f("hotel.in");
f>>N>>P;
init(1,1,N);
ofstream g("hotel.out");
while(P--)
{
f>>c;
if(c==1 || c==2)
{
if(c==1)c=0;
if(c==2)c=1;
f>>l>>r;
r+=(l-1);
update(1,1,N);
}
else g<<ARB[1].c<<"\n";
}
f.close();
g.close();
return 0;
}