Pagini recente » Cod sursa (job #2165979) | Cod sursa (job #2238277) | Cod sursa (job #2280328) | Cod sursa (job #1242458) | Cod sursa (job #2246357)
#include <fstream>
#include <algorithm>
using namespace std;
struct AINT
{
int left, right, best, sum;
bool flag;
AINT()
{
this->left = this->right = this->best = this->sum = 0;
this->flag = false;
}
};
const int NMAX = 1e5 + 10;
int n, p, op;
AINT aint[4 * NMAX];
inline int LeftSon(const int &x)
{
return 2 * x;
}
inline int RightSon(const int &x)
{
return 2 * x + 1;
}
void Build(int node, int left, int right)
{
if (left == right)
{
aint[node].left = aint[node].right = aint[node].best = aint[node].sum = 1;
aint[node].flag = false;
return;
}
int mid = (left + right) / 2;
Build(LeftSon(node), left, mid);
Build(RightSon(node), mid + 1, right);
aint[node].left = aint[node].right = aint[node].best = aint[node].sum = aint[LeftSon(node)].sum + aint[RightSon(node)].sum;
aint[node].flag = false;
}
void Update(int node, int left, int right, const int &LeftQuery, const int &RightQuery)
{
if (LeftQuery <= left && right <= RightQuery)
{
if (op == 1)
{
//vin oameni
aint[node].flag = true;
}
else
{
//pleaca oameni
aint[node].flag = false;
}
return;
}
int mid = (left + right) / 2;
if (LeftQuery <= mid)
{
if (aint[node].flag == true)
{
aint[node].flag = false;
aint[LeftSon(node)].flag = true;
aint[RightSon(node)].flag = true;
}
Update(LeftSon(node), left, mid, LeftQuery, RightQuery);
}
if (RightQuery >= mid + 1)
{
if (aint[node].flag == true)
{
aint[node].flag = false;
aint[LeftSon(node)].flag = true;
aint[RightSon(node)].flag = true;
}
Update(RightSon(node), mid + 1, right, LeftQuery, RightQuery);
}
if (aint[LeftSon(node)].flag == true && aint[RightSon(node)].flag == true)
aint[node].flag = false, aint[node].left = aint[node].right = aint[node].best = 0;
else if (aint[LeftSon(node)].flag == false && aint[RightSon(node)].flag == true)
aint[node].flag = false, aint[node].left = 0, aint[node].right = aint[LeftSon(node)].right, aint[node].best = aint[LeftSon(node)].best;
else if (aint[LeftSon(node)].flag == true && aint[RightSon(node)].flag == false)
aint[node].flag = false, aint[node].right = 0, aint[node].left = aint[RightSon(node)].right, aint[node].best = aint[RightSon(node)].best;
else if (aint[LeftSon(node)].flag == false && aint[RightSon(node)].flag == false)
{
aint[node].flag = false;
aint[node].best = max(aint[LeftSon(node)].left + aint[RightSon(node)].right, max(aint[LeftSon(node)].best, aint[RightSon(node)].best));
aint[node].left = aint[RightSon(node)].left;
if (aint[node].left != 0 && aint[RightSon(node)].sum == aint[node].left)
aint[node].left = aint[RightSon(node)].sum + aint[LeftSon(node)].left;
aint[node].right = aint[LeftSon(node)].right;
if (aint[node].right != 0 && aint[LeftSon(node)].sum == aint[node].right)
aint[node].right = aint[LeftSon(node)].sum + aint[RightSon(node)].right;
}
}
inline int Query()
{
return aint[1].best;
}
int main()
{
ifstream fin("hotel.in");
ofstream fout("hotel.out");
fin >> n >> p;
Build(1, 1, n);
int st, cnt;
for (int i = 1;i <= p;++i)
{
fin >> op;
if (op == 3)
fout << Query() << "\n";
else
{
fin >> st >> cnt;
Update(1, 1, n, st, st + cnt - 1);
}
}
fin.close();
fout.close();
return 0;
}