这是使用hzwer建议的set写的分块代码,set自动排序,支持二分查找,但是常数较大,比我下面写的用vector实现的分块慢了三倍,空间大了10倍。
#include <cstdio>
#include <cstring>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <set>
using namespace std;
typedef int ll;
const int N = 500007, M = 500007, INF = 0x3f3f3f3f;
ll read() {
ll x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
//就是要避免重复的权值的,所以用set
int n, m;
int v[N];
int block, bi[N];
int add_tag[N];
set<int>st[N];
void modify(int a, int b, int c)
{
for(int i = a; i <= min(bi[a] * block, b); ++ i){
st[bi[a]].erase(v[i]);
v[i] += c;
st[bi[a]].insert(v[i]);
}
if(bi[a] != bi[b]){
for(int i = (bi[b] - 1) * block + 1; i <= b; ++ i){
st[bi[b]].erase(v[i]);
v[i] += c;
st[bi[b