请你写出一种数据结构,来维护一个长度为 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