Pagini recente » Cod sursa (job #2009673) | Cod sursa (job #2025948) | Cod sursa (job #2620976) | Cod sursa (job #556559) | Cod sursa (job #1764067)
#include <iostream>
#include <fstream>
#define NMAX 100000
using namespace std;
int type;
struct str
{
int maxi,st,dr;
};
const int db = 0;
str aint[NMAX * 4 + 4];
void update (int nod, int in, int sf, int a, int b)
{
if (in >= a && sf <= b)
{
// cout << "s";
if (type == 2)
aint[nod].maxi = aint[nod].st = aint[nod].dr = sf - in + 1;
else
aint[nod].maxi =aint[nod].st = aint[nod].dr = 0;
return ;
}
int mid = (in + sf) / 2;
if (aint[nod].maxi == (sf - in + 1))
{
aint[2 * nod + 1].st = aint[2 * nod + 1].dr = aint[2 * nod + 1].maxi = ( sf - mid) ;
aint[2 * nod].st = aint[2 * nod].dr = aint[2 * nod].maxi = (mid - in + 1) ;
}
if (aint[nod].maxi == 0)
{
aint[2 * nod + 1].st = aint[2 * nod + 1].dr = aint[2 * nod + 1].maxi = 0;
aint[2 * nod].st = aint[2 * nod].dr = aint[2 * nod].maxi = 0 ;
}
// cout << in <<" " <<sf << " " << a << " " << b << "\n";
if (mid >= a)
update (2 * nod, in, mid, a, b);
if (mid < b)
update (2 * nod + 1, mid + 1, sf, a, b);
if (aint[nod * 2].st == mid - in + 1)
aint[nod].st = aint[2 * nod].st + aint[2 * nod + 1].st;
else
aint[nod].st = aint[2 * nod].st;
if (aint[2 * nod + 1].dr == sf - mid)
aint[nod].dr = aint[2 * nod].dr + aint[2 * nod +1].dr;
// aint[nod].st = aint[2 * nod].st;
else
aint[nod].dr = aint[2 * nod + 1].dr;
aint[nod].maxi = max (aint[nod * 2].maxi, aint[nod * 2 + 1].maxi);
aint[nod].maxi = max (aint[nod].maxi, aint[nod * 2].dr + aint[2 * nod + 1].st);
//int dbg = 1;
if (db)
cout << in <<" " << sf <<" " << aint[nod].maxi << " " << aint[nod].st << " " << aint[nod].dr << "\n";
}
void init (int nod, int a, int b)
{
aint[nod].st = aint[nod].dr = aint[nod].maxi = b - a + 1;
if (a == b)
return;
int mid = (a + b) / 2;
init (2 * nod, a, mid);
init (2 * nod + 1, mid + 1, b);
}
int main()
{
int x, y, n, p;
ifstream cin ("hotel.in");
ofstream cout ("hotel.out");
cin >> n >> p;
type = 2;
update (1,1, n, 1 ,n);
for (int i = 1; i <= p; i++)
{
cin >> type;
if(type == 3)
cout << aint[1].maxi << "\n";
else
{
cin >> x >> y;
update (1, 1, n, x, y + x - 1);
}
}
return 0;
}