/*
定义:多重集s的元素和是sum,对于sum的第i位为x,如果s里找不到第i位也是x的元素,那么称这个多重集为bad,
现在给定一个 序列a
两种操作
1 i x:将序列第i个元素改为x
2 l r: a[l..r]组成的多重集中,找一个和最小的bad子集,如果没有这样的子集,输出-1 如果集合中有两个数A,B在某一位都不为0,那么这个集合必定为bad,那么在区间[l..r]里找一个最小的bad集合,必定是两个数之和
我们只要找在该区间最小的两个在某一位都不为0的数即可
线段树每个结点开数组Min[10][2]维护a[l..r]里第i位不为0的最小和次小数
*/
#include<bits/stdc++.h>
using namespace std;
#define N 200005
#define INF 0x3f3f3f3f3f
#define ll long long
ll n,a[N],m; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
struct Node{ll x[][];}t[N<<];
ll buf[];
void calc(ll x){
for(int i=;i<;i++)
buf[i]=x%,x/=;
}
Node merge(Node a,Node b){
Node res;
for(int i=;i<;i++)
res.x[i][]=res.x[i][]=INF;
for(int i=;i<;i++){
ll m1=a.x[i][],m2=b.x[i][];
res.x[i][]=min(m1,m2);
res.x[i][]=max(m1,m2);
res.x[i][]=min(res.x[i][],a.x[i][]);
res.x[i][]=min(res.x[i][],b.x[i][]);
}
return res;
}
void build(int l,int r,int rt){
if(l==r){
calc(a[l]);
for(int i=;i<;i++){
if(buf[i])t[rt].x[i][]=a[l];
else t[rt].x[i][]=INF;
t[rt].x[i][]=INF;
}
return;
}
int m=l+r>>;
build(lson);build(rson);
t[rt]=merge(t[rt<<],t[rt<<|]);
}
void update(ll pos,ll v,int l,int r,int rt){
if(l==r){
calc(v);
for(int i=;i<;i++){
if(buf[i])t[rt].x[i][]=v;
else t[rt].x[i][]=INF;
t[rt].x[i][]=INF;
}
return;
}
int m=l+r>>;
if(pos<=m)update(pos,v,lson);
else update(pos,v,rson);
t[rt]=merge(t[rt<<],t[rt<<|]);
}
Node query(ll L,ll R,ll l,ll r,ll rt){
if(L<=l && R>=r)return t[rt];
int m=l+r>>;
Node res;
for(int i=;i<;i++)
res.x[i][]=res.x[i][]=INF;
if(L<=m)res=merge(res,query(L,R,lson));
if(R>m)res=merge(res,query(L,R,rson));
return res;
}
int main(){
cin>>n>>m;
for(int i=;i<=n;i++)cin>>a[i];
build(,n,); while(m--){
ll op,l,r;
scanf("%lld%lld%lld",&op,&l,&r);
if(op==)
update(l,r,,n,);
else {
Node t=query(l,r,,n,);
ll ans=INF;
for(int i=;i<;i++)
ans=min(ans,t.x[i][]+t.x[i][]);
if(ans>=INF)puts("-1");
else cout<<ans<<'\n';
}
}
}

线段树区间合并——cf1217E的更多相关文章

  1. POJ 3667 Hotel(线段树 区间合并)

    Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...

  2. HDU 3911 线段树区间合并、异或取反操作

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...

  3. HDU 3911 Black And White(线段树区间合并+lazy操作)

    开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...

  4. HYSBZ 1858 线段树 区间合并

    //Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...

  5. poj3667 线段树 区间合并

    //Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...

  6. hdu3911 线段树 区间合并

    //Accepted 3911 750MS 9872K //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...

  7. 线段树(区间合并) POJ 3667 Hotel

    题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...

  8. HDU 3308 LCIS (线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...

  9. SPOJ GSS1_Can you answer these queries I(线段树区间合并)

    SPOJ GSS1_Can you answer these queries I(线段树区间合并) 标签(空格分隔): 线段树区间合并 题目链接 GSS1 - Can you answer these ...

随机推荐

  1. Scrapy爬虫框架的使用

    #_author:来童星#date:2019/12/24# Scrapy爬虫框架的使用#1.安装Twisted模块 https://www.lfd.uci.edu/~gohlke/pythonlibs ...

  2. GPIO软件模拟IIC时序

    一.MPU6050中的IIC时序 1.1 START和STOP SDA和SCL在高电平时,SDA拉低表示START.SCL拉低,表示可以传输数据. SDA和SCL在低电平时,SDA拉高表示STOP. ...

  3. Kattis - boxes (LCA)

    Boxes There are NN boxes, indexed by a number from 11 to NN. Each box may (or not may not) be put in ...

  4. 木棍加工(dp,两个参数的导弹拦截问题)

    题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的:     第一根棍子的准备时间为1分钟:   ...

  5. hdu1166 敌兵布阵 (线段树单点更新)

    Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营 地,Derek和Tidy的任务就是要监视这 ...

  6. SCP-bzoj-1058

    项目编号:bzoj-1058 项目等级:Safe 项目描述: 戳这里 特殊收容措施: STL好题.维护两个set,一个存储数列里相邻元素差,另一个存储整个数列. 对于MIN_SORT_GAP操作,维护 ...

  7. Python基础教程(003)--Python的设计目标

    前言 了解Python的设计目标,这节是了解Python的背景,不需要掌握,但是需要你知道有这个东西.就是Python的目的是什么.作者开发这个Python语言的目的是什么. 知识点 一门简单直观的语 ...

  8. horizontalAccuracy 检测定位成功

    - (void)findCurrentLocation { self.isFirstUpdate = YES; [self.locationManager startUpdatingLocation] ...

  9. 关于Extjs6.0 controller文件过大,实现模块化分离

    Extjs一般都是一个视图对应着一个controller 一旦碰到视图中逻辑过于繁琐造成controller文件过大不利于维护和修改,所以要通过混入mixins混入功能来实现模块化! 首先创建一个视图 ...

  10. djanjo中url路由匹配规则是啥意思

    一,django路由匹配规则的本质是通过正则表达式对用户的url进行匹配. 1,r 是正则表达式中防止转义的符号,例如在python/n代表换行,加上r就不换行了. 2,$ 正则表达式中表示以什么什么 ...