#include <iostream> #include <algorithm> #include <vector> using namespace std; typedef pair<int, int> PII; #define N 300010 vector<int> alls; vector<PII> add, query; long long a[N], s[N]; int n, m; //求出x离散化后的值(第一个>=x的位置) int find(int x){ int l = 0, r = alls.size()-1; int mid = (l+r) / 2; while (l < r){ if (alls[mid] >= x) r = mid; else l = mid + 1; mid = (l + r) / 2; } return mid + 1; //映射到1...n } void insert(){ int x, c; cin >> x >> c; alls.push_back(x); //将输入转化为插入操作 add.push_back({x, c}); } void search(){ int l, r; cin >> l >> r; alls.push_back(l); alls.push_back(r); query.push_back({l, r}); } int main(){ cin >> n >> m; for (int i = 1; i <= n; i ++){ int x, c; x = i; cin >> c; alls.push_back(x); add.push_back({x, c}); } int flag; while (m --){ cin >> flag; if (flag == 1){ insert(); } else if (flag == 2){ search(); } } sort(alls.begin(), alls.end()); alls.erase(unique(alls.begin(), alls.end()), alls.end()); //映射 for (auto item : add){ int x = find(item.first); a[x] += item.second; //cout << item.first << " " << x << " " << a[x] << endl; } /**/ for (int i = 1; i <= alls.size(); i ++){ s[i] += s[i-1] + a[i]; } for (auto item : query){ int l = find(item.first); int r = find(item.second); //cout << l << " " << r << endl; cout << s[r] - s[l-1] << endl; } }
全部评论
(0) 回帖