//寻找x所在的离散化后位置,并返回下标+1,加1是因为我们的下标从1开始(这里是映射过程) 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; }
intmain(){ cin >> n >> m; //n次插入 for(int i = 0; i < n; i++) { int x, c; cin >> x >> c; // x是真实下标,c是加上的数字 add_query.emplace_back(x, c); alls.push_back(x); } //m次查询 for(int i = 0; i < m; i++) { int l, r; cin >> l >> r; search_query.emplace_back(l, r); //查找的下标也要push进去,不然的话计算前缀和的时候就找不到下标了 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_query) { int x = find(item.first); a[x] += item.second; } //计算前缀和,注意离散化后的数组大小就是alls的,因为alls存储的是真实下标,所以这个数组的大小就是a的数组大小 for(int i = 1; i <= alls.size(); i++) s[i] = s[i - 1] + a[i]; //处理询问,前缀和的做法 for(auto item : search_query) { int l = find(item.first), r = find(item.second); cout << s[r] - s[l - 1] << endl; } }