Pagini recente » Cod sursa (job #1775838) | Cod sursa (job #2392937) | Cod sursa (job #2944201) | Cod sursa (job #3223217) | Cod sursa (job #2989511)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5;
struct Node {
int ans = 0;
int pref = 0;
int suf = 0;
int len = 0;
int lazy = 0;
}aint[4*nmax+5];
Node Merge(Node left, Node right) {
Node temp;
temp.ans = max({left.ans, right.ans, left.suf + right.pref});
temp.pref = left.pref;
if(left.ans == left.len) temp.pref = max(temp.pref, left.len + right.pref);
temp.suf = right.suf;
if(right.ans == right.len) temp.suf = max(temp.suf, right.len + left.suf);
temp.len = left.len + right.len;
return temp;
}
void build(int node, int left, int right) {
if(left == right) {
aint[node].ans = 1;
aint[node].pref = 1;
aint[node].suf = 1;
aint[node].len = 1;
aint[node].lazy = 0;
return;
}
int mid = (left + right) / 2;
build(node*2, left, mid);
build(node*2+1, mid+1, right);
aint[node] = Merge(aint[node*2], aint[node*2+1]);
}
void push(int node, int left, int right) {
if(aint[node].lazy == 0) return;
if(aint[node].lazy == 1) {
aint[node].ans = 0;
aint[node].pref = 0;
aint[node].suf = 0;
}
else if(aint[node].lazy == 2) {
aint[node].ans = aint[node].len;
aint[node].pref = aint[node].len;
aint[node].suf = aint[node].len;
}
if(left != right) {
aint[node*2].lazy = aint[node].lazy;
aint[node*2+1].lazy = aint[node].lazy;
}
aint[node].lazy = 0;
return;
}
void update(int node, int left, int right, int st, int dr, int type) {
push(node, left, right);
if(right < st or left > dr) return;
if(st <= left and right <= dr) {
aint[node].lazy = type;
push(node, left, right);
return;
}
int mid = (left + right) / 2;
update(node*2, left, mid, st, dr, type);
update(node*2+1, mid+1, right, st, dr, type);
aint[node] = Merge(aint[node*2], aint[node*2+1]);
}
int main() {
ifstream f("hotel.in");
ofstream g("hotel.out");
int n, q; f >> n >> q;
build(1, 1, n);
for(int i=1; i<=q; i++) {
int type; f >> type;
if(type == 1 or type == 2) {
int pos, cnt; f >> pos >> cnt;
update(1, 1, n, pos, pos+cnt-1, type);
}
else g << aint[1].ans << "\n";
}
return 0;
}