Pagini recente » Cod sursa (job #3003195) | Cod sursa (job #1718816) | Cod sursa (job #1113709) | Cod sursa (job #968916) | Cod sursa (job #1015660)
#include <fstream>
using namespace std;
const int MAX_N = 200002;
struct SegmentTree {
int ans, left, right;
};
int N, M;
SegmentTree A[MAX_N];
void buildTree(int node, int left, int right) {
int m = (left + right)/2, ls = 2*node, rs = 2*node + 1;
A[node].ans = A[node].left = A[node].right = right - left + 1;
if(left != right) {
buildTree(ls, left, m);
buildTree(rs, m + 1, right);
}
}
void update(int node, int left, int right, int x, int y, int val) {
int m = (left + right)/2, ls = 2*node, rs = 2*node + 1;
if(x <= left && right <= y)
A[node].ans = A[node].left = A[node].right = (right - left + 1)*val;
else {
if(A[node].ans == right - left + 1) {
A[ls].ans = A[ls].left = A[ls].right = m - left + 1;
A[rs].ans = A[rs].left = A[rs].right = right - m;
}
else if(A[node].ans == 0) {
A[ls].ans = A[ls].left = A[ls].right = 0;
A[rs].ans = A[rs].left = A[rs].right = 0;
}
if(x <= m)
update(ls, left, m, x, y, val);
if(y > m)
update(rs, m + 1, right, x, y, val);
if(A[ls].left == m - left + 1)
A[node].left = A[ls].left + A[rs].left;
else A[node].left = A[ls].left;
if(A[rs].right == right - m)
A[node].right = A[rs].right + A[ls].right;
else A[node].right = A[rs].right;
A[node].ans = max(A[ls].ans, A[rs].ans);
A[node].ans = max(A[node].ans, A[ls].right + A[rs].left);
}
}
inline int query(int node) {
return A[node].ans;
}
int main() {
ifstream f("hotel.in");
ofstream g("hotel.out");
f >> N >> M;
buildTree(1, 1, N);
for(int i = 1, t, x, y; i <= M; ++i) {
f >> t;
if(t == 3)
g << query(1) << "\n";
else {
f >> x >> y;
y += x - 1;
if(t == 2)
t = 1;
else t = 0;
update(1, 1, N, x, y, t);
}
}
f.close();
g.close();
return 0;
}