/*
定义:多重集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. Delphi 字符串函数SysUtils单元 AnsiSameStr、AnsiSameText、AnsiCompareStr、AnsiCompareText、AnsiCompareFileName、AnsiUpperCase、AnsiLowerCase、AnsiUpperCaseFileName、AnsiLowerCaseFileName、AnsiPos、AnsiQuotedStr

    USES 单元 SysUtils 非 StrUtils AnsiSameStr.AnsiSameText.AnsiCompareStr.AnsiCompareText.AnsiCompareFileN ...

  2. Delphi ini文件结构简介

    一.INI文件的结构:; 注释[小节名]关键字=值 INI文件允许有多个小节,每个小节又允许有多个关键字, “=”后面是该关键字的值. 值的类型有三种:字符串.整型数值和布尔值.其中字符串存贮在INI ...

  3. tomcat设置deploy部署文件位置

    参考: https://blog.csdn.net/xiaojiang167168/article/details/25330899 一.较新版本的eclipse中,Tomcat设置之后,项目部署.编 ...

  4. 前端每日实战:58# 视频演示如何用纯 CSS 创作一只卡通鹦鹉

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/vrRmWy 可交互视频 此视频是可 ...

  5. Redis缓存接入监控、运维平台CacheCloud

    改造RedisConnectionFactory /** * 根据缓存策略的不同,RedisConnectionFactory不同 * 示例是单机模式. * * @return */@Beanpubl ...

  6. JavaWeb解决中文乱码

    1.Get请求,方案有两种 A:修改Tomcat配置文件 server.xml   URIEncoding="UTF-8" 如:<Connector port="8 ...

  7. linux下lamp.sh一键配置lamp环境流程

    linux下lamp.sh一键配置lamp环境流程 一.总结 一句话总结: 2.将网站从github上clone到/data/www/网站域名/ 3.更改网站目录权限:chown -R apache: ...

  8. Nginx网络架构实战学习笔记(四):nginx连接memcached、第三方模块编译及一致性哈希应用

    文章目录 nginx连接memcached 第三方模块编译及一致性哈希应用 总结 nginx连接memcached 首先确保nginx能正常连接php location ~ \.php$ { root ...

  9. PAT甲级——A1152 GoogleRecruitment【20】

    In July 2004, Google posted on a giant billboard along Highway 101 in Silicon Valley (shown in the p ...

  10. activiti7查询当前用户任务列表

    package com.zcc.acvitivi; import org.activiti.engine.ProcessEngine;import org.activiti.engine.Proces ...