Pagini recente » Cod sursa (job #478734) | Cod sursa (job #91775) | Cod sursa (job #166906) | Cod sursa (job #2800521) | Cod sursa (job #1768009)
#include <stdio.h>
#include <stdlib.h>
#define MAXN 200000
#define BUF_SIZE 16384
char buf[BUF_SIZE];
int pbuf=BUF_SIZE;
FILE*fi,*fo;
inline char nextch(){
if(pbuf==BUF_SIZE){
fread(buf, BUF_SIZE, 1, fi);
pbuf=0;
}
return buf[pbuf++];
}
inline long long nextnum(){
long long a=0;
char c=nextch();
while((c<'0' || c>'9') && c!='-')
c=nextch();
int semn=1;
if(c=='-'){
semn=-1;
c=nextch();
}
while('0'<=c && c<='9'){
a=a*10+c-'0';
c=nextch();
}
return a*semn;
}
long long w[MAXN+1];
struct FraxinusPennsylvanicaVarSubintegerrima{
long long suff, pref, len, num;
long long lazy;
} v[4*MAXN];///pentru persoanele curioase, care nu ar trebui sa imi citeasca sursa, aista ii nume de pom, sau cum le place unora sa zica, arbore de intervale
inline long long maxim(long long a, long long b){
return a > b ? a : b;
}
inline long long maxim3(long long a, long long b, long long c){
if(a>maxim(b, c))
return a;
return b > c ? b : c;
}
inline FraxinusPennsylvanicaVarSubintegerrima lazySeDuce(FraxinusPennsylvanicaVarSubintegerrima p){
if(p.lazy==2)//plin
p.pref=p.suff=p.num=0;
else if(p.lazy==1)//gol
p.pref=p.suff=p.num=p.len;
return p;
}
void parcurgere(int p, int st, int dr){
if(st==dr){
v[p].suff=v[p].pref=v[p].num=v[p].len=1;
v[p].lazy=0;
}
else{
parcurgere(2*p, st, (st+dr)/2);
parcurgere(2*p+1, (st+dr)/2+1, dr);
v[p].len=v[2*p].len+v[2*p+1].len;
if(v[2*p].len=v[2*p].num) v[p].pref=v[2*p].len+v[2*p+1].pref;
else v[p].pref=v[2*p].pref;
if(v[2*p+1].len=v[2*p+1].num) v[p].suff=v[2*p+1].len+v[2*p].suff;
else v[p].suff=v[2*p+1].suff;
v[p].num=maxim3(v[p].pref, v[p].suff, v[2*p].suff+v[2*p+1].pref);
v[p].lazy=0;
}
}
int left, right;
long long val;
void update(int p, int st, int dr){
if(left<=st && dr<=right){
v[p].lazy=val;
v[p]=lazySeDuce(v[p]);
}
else{
int m=(st+dr)/2;
if(v[p].lazy>0){
v[2*p].lazy=v[2*p+1].lazy=v[p].lazy;
v[2*p]=lazySeDuce(v[2*p]);
v[2*p+1]=lazySeDuce(v[2*p+1]);
v[p].lazy=0;
}
if(left<=m) update(2*p, st, m);
if(m<right) update(2*p+1, m+1, dr);
FraxinusPennsylvanicaVarSubintegerrima q=lazySeDuce(v[2*p]), r=lazySeDuce(v[2*p+1]);
v[p].len=q.len+r.len;
if(q.len==q.num) v[p].pref=q.len+r.pref;
else v[p].pref=q.pref;
if(r.len==r.num) v[p].suff=r.len+q.suff;
else v[p].suff=r.suff;
v[p].num=maxim3(v[p].pref, v[p].suff, q.suff+r.pref);
v[p].lazy=0;
}
}
int main(){
fi=fopen("hotel.in","r");
fo=fopen("hotel.out","w");
int n=nextnum(), p=nextnum();
parcurgere(1, 1, n);
for(int i=0;i<p;i++){
int c=nextnum();
if(c==1){
left=nextnum();
right=nextnum();
right=left+right-1;
val=2;
update(1, 1, n);
}
else if(c==2){
left=nextnum();
right=nextnum();
right=left+right-1;
val=1;
update(1, 1, n);
}
else{
FraxinusPennsylvanicaVarSubintegerrima a=lazySeDuce(v[1]);
fprintf(fo,"%lld\n", a.num);
}
}
fclose(fi);
fclose(fo);
return 0;
}