题意:
给你n 个数,和m 个操作,m 个操作先查询 [L,R]上比x 小的个数, 在根据这个数 对 某个数进行变换。
思路:
真的是xjb 操作啊,直接分块怼就行。
直接建立一个有序的分块即可。
然后就是删除vecror 和插入排序。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
typedef long long LL;
const int maxn = 300000 + 10;
int n, m;
LL u;
int block, num;
LL a[maxn];
vector<LL>bit[1000];
int L[1000],R[1000],belong[maxn];
void init(){
block = sqrt(n);
num = n / block;
if (n % block) ++num;
for (int i = 1; i <= num; ++i){
L[i] = (i-1)*block+1;
R[i] = i*block;
}
R[num] = n;
for (int i = 1; i <= n; ++i){
belong[i] = (i-1)/block+1;
bit[belong[i] ].push_back(a[i]);
}
for (int i = 1; i <= num; ++i){
sort(bit[i].begin(), bit[i].end());
}
}
int main(){
scanf("%d %d %lld",&n, &m, &u);
for (int i = 1; i <= n; ++i){
scanf("%lld",a+i);
}
init();
while(m--){
int l,r,v,p;
scanf("%d %d %d %d",&l, &r, &v, &p);
int k = 0;
for (int i = belong[l] + 1; i < belong[r]; ++i){
k += lower_bound(bit[i].begin(),bit[i].end(),v) - bit[i].begin();
}
for (int i = l; i <= R[belong[l] ]; ++i){
if (a[i] < v)++k;
}
for (int i = L[belong[r]]; i <= r; ++i){
if (a[i] < v)++k;
}
int id = belong[p];
int x = u*(LL)k/(LL)(r-l+1);
bit[id].erase(lower_bound(bit[id].begin(),bit[id].end(),a[p]));
bit[id].insert(lower_bound(bit[id].begin(),bit[id].end(),x),x);
a[p] = x;
}
for (int i = 1; i <= n; ++i) printf("%lld\n",a[i]);
return 0;
}