树套树——线段树套set

请你写出一种数据结构,来维护一个长度为 n 的序列,其中需要提供以下操作:

1 pos x,将 pos 位置的数修改为 x。
2 l r x,查询整数 x 在区间 [l,r] 内的前驱(前驱定义为小于 x,且最大的数)。
数列中的位置从左到右依次标号为 1∼n。

区间 [l,r] 表示从位置 l 到位置 r 之间(包括两端点)的所有数字。

区间内排名为 k 的值指区间内从小到大排在第 k 位的数值。(位次从 1 开始)

输入格式
第一行包含两个整数 n,m,表示数列长度以及操作次数。

第二行包含 n 个整数,表示有序数列。

接下来 m 行,每行包含一个操作指令,格式如题目所述。

输出格式
对于所有操作 2,每个操作输出一个查询结果,每个结果占一行。

数据范围
1≤n,m≤5×104,
1≤l≤r≤n,
1≤pos≤n,
0≤x≤108,
有序数列中的数字始终满足在 [0,108] 范围内,
数据保证所有操作一定合法,所有查询一定有解。

输入样例:
5 3
3 4 2 1 5
2 2 4 4
1 3 5
2 2 4 4
输出样例:
2
1

题解:

每个区间套一个set。

#include <bits/stdc++.h>
//#define int long long
#define lson u<<1
#define rson u<<1|1
using namespace std;
//const int mod=1e9+7;
const int inf=1e9;
const int N=5e4+10;
int w[N];
struct Node
{
   
    int l,r;
    multiset<int> st;
    int mid() {
   
        return l+r>>1;
    }
}tr[N<<2];
void build(int u,int l,int r)
{
   
    tr[u]={
   l,r};
    tr[u
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值