Pagini recente » Concursuri organizate de infoarena | Cod sursa (job #177302) | Cod sursa (job #2477589) | dot-com/2012/clasament/runda-1 | Cod sursa (job #382095)
Cod sursa(job #382095)
#include <stdio.h>
#define NMAX 100005
int t[NMAX*3], st[NMAX*3], dr[NMAX*3], in[NMAX*3], okz[NMAX*3];
int n, m, a, b, ok, P, Q, ok2;
inline int max(int a, int b){
if(a > b) return a;
return b;
}
void rezolva(int x, int y){
int fiu;
if(2*x+1 == y) {
fiu = 2*x;
okz[fiu] = 1;
t[fiu] = (P+Q)/2 - P + 1;
st[fiu] = dr[fiu] = in[fiu] = 0;
}
else {
fiu = 2*x+1;
okz[fiu] = 1;
t[fiu] = Q - (P+Q)/2;
st[fiu] = dr[fiu] = in[fiu] = 0;
}
}
void update(int p, int q, int i){
if(a <= p && q <= b){
if(ok){
t[i] = q - p + 1;
st[i] = dr[i] = in[i] = 0;
okz[i] = 1;
}
else {
t[i] = 0;
okz[i] = 0;
st[i] = dr[i] = in[i] = q-p+1;
if(ok2)
rezolva(i/2, i);
}
return ;
}
P = p;
Q = q;
int m = (p+q)>>1;
ok2 |= okz[i];
okz[i] = 0;
if(a <= m) update(p, m, 2*i);
P = p;
Q = q;
if(b > m) update(m+1, q, 2*i+1);
if(t[2*i] == 0) st[2*i] = dr[2*i] = in[2*i] = m-p+1;
if(t[2*i+1] == 0) st[2*i+1] = dr[2*i+1] = in[2*i+1] = q-m;
in[i] = max(dr[2*i]+st[2*i+1], max(in[2*i], in[2*i+1]));
if(st[2*i] == m-p+1) st[i] = st[2*i] + st[2*i+1];
else st[i] = st[2*i];
if(dr[2*i+1] == q-m) dr[i] = dr[2*i+1] + dr[2*i];
else dr[i] = dr[2*i+1];
t[i] = t[2*i]+t[2*i+1];
}
int main(){
int i;
freopen("hotel.in", "r", stdin);
freopen("hotel.out", "w", stdout);
scanf("%d%d", &n, &m);
for(i = 1; i <= m; ++i){
int x, y;
scanf("%d", &x);
if(x == 1){
scanf("%d%d", &x, &y);
a = x; b = x + y - 1;
ok = 1;
update(1,n,1);
}
else if(x== 2){
scanf("%d%d", &x, &y);
a = x; b = x + y - 1;
ok = 0;
ok2 = 0;
update(1,n,1);
}
else if(i == 1) printf("%d\n", n);
else printf("%d\n",in[1]);
}
return 0;
}