#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define INF 1000001000
const int maxn = 100100;
int sum[maxn<<2],lsum[maxn<<2],rsum[maxn<<2],col[maxn<<2];
void build(int l,int r,int rt){
col[rt]=-1;
sum[rt]=lsum[rt]=rsum[rt]=r-l+1;
if(l==r) return ;
int m=(l+r)>>1;
build(lson);
build(rson);
}
void pushdown(int l,int r,int rt){
if(col[rt]!=-1){
int m=(l+r)>>1;
col[rt<<1]=col[rt<<1|1]=col[rt];
if(col[rt]){
sum[rt<<1]=lsum[rt<<1]=rsum[rt<<1]=0;
sum[rt<<1|1]=lsum[rt<<1|1]=rsum[rt<<1|1]=0;
}
else{
sum[rt<<1]=lsum[rt<<1]=rsum[rt<<1]=m-l+1;
sum[rt<<1|1]=lsum[rt<<1|1]=rsum[rt<<1|1]=r-m;
}
col[rt]=-1;
}
}
void pushup(int l,int r,int rt){
int m=(l+r)>>1;
sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
sum[rt]=max(sum[rt],rsum[rt<<1]+lsum[rt<<1|1]);
lsum[rt]=lsum[rt<<1];
if(lsum[rt]==m-l+1) lsum[rt]+=lsum[rt<<1|1];
rsum[rt]=rsum[rt<<1|1];
if(rsum[rt]==r-m) rsum[rt]+=rsum[rt<<1];
}
//check_out
int ql,qr,val;
void update(int l,int r,int rt){
if(ql<=l&&r<=qr){
col[rt]=val;
if(val){ sum[rt]=lsum[rt]=rsum[rt]=0; }
else { sum[rt]=lsum[rt]=rsum[rt]=r-l+1; }
return ;
}
pushdown(l,r,rt);
int m=(l+r)>>1;
if(ql<=m) update(lson);
if(qr> m) update(rson);
pushup(l,r,rt);
}
int width,ans;
void query(int l,int r,int rt){
//cout<<l<<" "<<r<<" "<<endl;
if(l==r){
ans=l; return ;
}
pushdown(l,r,rt);
int m=(l+r)>>1;
int ok1=0,ok2=0;
if(sum[rt<<1]>=width) ok1=1;
if(sum[rt<<1|1]>=width) ok2=1;
if(ok1){
query(lson);
}
else if(!ok1&&!ok2){
ans= m-rsum[rt<<1]+1;
}
else {
if(rsum[rt<<1]+lsum[rt<<1|1]>=width){
ans= m-rsum[rt<<1]+1;
}
else {
query(rson);
}
}
}
int n,Q;
int main()
{
while(scanf("%d %d",&n,&Q)==2){
build(1,n,1);
while(Q--){
int cmd;
scanf("%d",&cmd);
if(cmd==1){
scanf("%d",&width);
if(sum[1]>=width){
query(1,n,1);
printf("%d\n",ans);
ql=ans; qr=ans+width-1; val=1;
update(1,n,1);
}
else printf("0\n");
}
else {
int d;
scanf("%d %d",&ql,&d);
qr=ql+d-1; val=0;
update(1,n,1);
}
//cout<<sum[1]<<endl;
}
}
return 0;
}
POJ-3667 线段树(区间合并)
最新推荐文章于 2019-08-09 13:41:57 发布
本文介绍了一种基于段树的数据结构实现方法,用于解决区间更新及查询的问题。该实现支持快速更新指定区间内的元素状态,并能高效地查询特定宽度的最大连续子区间。通过递归分解,将操作下放到叶子节点并维护区间属性,如最大和、左区最大和等。
581

被折叠的 条评论
为什么被折叠?



