intfind(int x) { int l = 0; r = alls.size() - 1; while (l < r) { int mid = l + r >> 1; if (alls[mid] > x) r = mid; else l = mid + 1; } return r + 1; // 加 1 意为从数组下标的 1 处开始映射,好处是可以方便前缀和的计算 }
intfind(int x) { int l = 0, r = alls.size() - 1; while(l < r) { int mid = r + l >> 1; if (alls[mid] >= x) r = mid; else l = mid + 1; } return r + 1; // 从1开始将所有的数进行映射,为了方便前缀和的计算 } // 找到x离散化后的结果 intmain() { int n, m; cin >> n >> m; for (int i = 0; i < n; i ++) { int x, c; cin >> x >> c; add.push_back({x, c}); alls.push_back(x); } // 读入所有的插入操作 for (int i = 0; i < m; i ++) { int l, r; cin >> l >> r; access.push_back({l, r}); alls.push_back(l); alls.push_back(r); } // 读入所有的区间,并求和 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; } // 进行插入操作 for (int i = 1; i <= alls.size(); i ++) s[i] = s[i - 1] + a[i]; // 计算序列的前缀和 for (auto item : access) { int l = find(item.first), r = find(item.second); cout << s[r] - s[l - 1] << endl; } return0; }