AcWing 802. 區間和
阿新 • • 發佈:2020-07-28
AcWing 802. 區間和
#include <bits/stdc++.h> using namespace std; const int N=300010; typedef pair<int,int> PII; int n,m; int a[N],s[N]; vector<int> alls; vector<PII> add; vector<PII> query; int find(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 l+1; } vector<int>::iterator unique(vector<int> &a){ int j=0; for(int i=0;i<a.size();i++) if(!i||a[i]!=a[i-1]) a[j++]=a[i]; //a[0]~a[j-1] 所有a中不重複的數 return a.begin()+j; } int main(){ 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; query.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()); alls.erase(unique(alls),alls.end()); //處理插入 for(int i=0;i<add.size();i++){ int x=find(add[i].first); a[x]+=add[i].second; } //預處理字首和 for(int i=1;i<=alls.size();i++) s[i]=s[i-1]+a[i]; //處理詢問 for(int i=0;i<query.size();i++){ int l=find(query[i].first); int r=find(query[i].second); cout<<s[r]-s[l-1]<<endl; } return 0; }