本人不擅长使用 set<node>::iterator 已知问题出现在26行 -- p;
求RE原因 或 如何修改
#include<bits/stdc++.h>
using namespace std;
#define it set<node>::iterator
#define int long long
#define mp make_pair
#define PII pair<int, int>
struct cht{
struct node{
int l, r;
mutable int x;
node(int ll, int rr, int vv){
l = ll, r = rr, x = vv;
}
bool operator<(const node &b) const {
return l < b.l;
}
};
set<node> s;
it split(int pos){
it p = s.lower_bound(node(pos, -1, 0));
cout << "trd\n";
if(p != s.end() && pos == p -> l) return p;
cout << "bye\n";
-- p;
cout << "hre\n";
int ll = p -> l, rr = p -> r, vv = p -> x;
cout << "arr\n";
s.erase(p);
cout << "saf\n";
s.insert(node(ll, pos - 1, vv));
return s.insert(node(pos, rr, vv)).first;
}
void assign(int l, int r, int x){
cout << "aqa\n";
it rr = split(r + 1), ll = split(l);
cout << "qaq\n";
s.erase(ll, rr);
s.insert(node(l, r, x));
}
vector<PII> get_vector(int l, int r){
vector<PII> ret;
it rr = split(r + 1), ll = split(l);
for(it i = ll ; i != rr ; i ++)
ret.push_back(mp((i -> x), ((i -> r) - (i -> l) + 1)));
sort(ret.begin(), ret.end());
return ret;
}
}t1, t2;
int query(int l, int r){
vector<PII> a, b;
a = t1.get_vector(l, r);
b = t2.get_vector(l, r);
int j = 0, ans = 0;
for(int i = 0 ; i < a.size() && j < b.size() ;){
if(a[i].second == b[i].second){
ans += a[i].second * a[i].first * b[j].first;
i ++, j ++;
}
else if(a[i].second > b[j].second){
ans += b[j].second * a[i].first * b[j].first;
a[i].second -= b[j].second;
j ++;
}
else{
ans += a[i].second * a[i].first * b[j].first;
b[j].second -= a[i].second;
i ++;
}
}
return ans;
}
void solve(){
int n, m;
cin >> n >> m;
for(int i = 1 ; i <= n ; i ++){
int x;
cin >> x;
t1.assign(i, i, x);
}
for(int i = 1 ; i <= n ; i ++){
int x;
cin >> x;
t2.assign(i, i, x);
}
// cout << "bruh\n";
for(int i = 1 ; i <= m ; i ++){
int md, l, r, v;
cin >> md >> l >> r >> v;
if(md == 1) t1.assign(l, r, v);
if(md == 2) t2.assign(l, r, v);
if(md == 3){
cout << query(l, r) << '\n';
t1.assign(l, r, v);
t2.assign(l, r, v);
}
}
}
signed main(){
solve();
}