Submission #1291254

#TimeUsernameProblemLanguageResultExecution timeMemory
1291254simona1230Examination (JOI19_examination)C++20
100 / 100
846 ms20828 KiB
#include <bits/stdc++.h> using namespace std; struct hey { int x,y,z,i; hey(){} hey(int _x,int _y,int _z,int _i) { x=_x; y=_y; z=_z; i=_i; } }; int n,q; hey a[200001]; vector<int> h; map<int,int> mp; bool cmpz(hey h1,hey h2) { if(h1.z==h2.z)return h1.i>h2.i; return h1.z<h2.z; } void read() { cin>>n>>q; for(int i=1;i<=n;i++) { cin>>a[i].x>>a[i].y; h.push_back(a[i].y); a[i].z=a[i].x+a[i].y; } for(int i=1;i<=q;i++) { cin>>a[i+n].x>>a[i+n].y>>a[i+n].z; h.push_back(a[i+n].y); a[i+n].i=i; } sort(h.begin(),h.end()); int id=0; for(int i=0;i<h.size();i++) { if(!i||h[i]!=h[i-1])id++; mp[h[i]]=id; } for(int i=1;i<=n+q;i++) a[i].y=mp[a[i].y]; sort(a+1,a+n+q+1,cmpz); } int t[800001]; void upd(int i,int l,int r,int id,int vl) { if(l==r) { t[i]+=vl; return; } int m=(l+r)/2; if(id<=m)upd(i*2,l,m,id,vl); else upd(i*2+1,m+1,r,id,vl); t[i]=t[i*2]+t[i*2+1]; } int query(int i,int l,int r,int ql,int qr) { if(ql>qr)return 0; if(ql<=l&&r<=qr)return t[i]; int m=(l+r)/2; return query(i*2,l,m,ql,min(qr,m))+query(i*2+1,m+1,r,max(m+1,ql),qr); } bool cmpx(hey h1,hey h2) { return h1.x<h2.x; } int ans[200001]; void solve(int l,int r) { if(l>=r)return; vector<hey> v1,v2; int m=(l+r)/2; solve(l,m); solve(m+1,r); //cout<<l<<" -- "<<r<<endl; for(int i=l;i<=m;i++) v1.push_back(a[i]); for(int i=m+1;i<=r;i++) v2.push_back(a[i]); sort(v1.begin(),v1.end(),cmpx); sort(v2.begin(),v2.end(),cmpx); int j=v2.size()-1; for(int i=v1.size()-1;i>=0;i--) { while(j>=0&&v1[i].x<=v2[j].x) { if(v2[j].i==0) { //cout<<"+ "<<v2[j].y<<endl; upd(1,1,n+q,v2[j].y,1); } j--; } //cout<<"? "<<v1[i].y<<" "<<query(1,1,n+q,v1[i].y,n+q)<<endl; ans[v1[i].i]+=query(1,1,n+q,v1[i].y,n+q); } for(int i=j+1;i<v2.size();i++) if(v2[i].i==0)upd(1,1,n+q,v2[i].y,-1); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); read(); solve(1,n+q); //for(int i=1;i<=q+n;i++) // cout<<a[i].x<<" "<<a[i].y<<" "<<a[i].z<<" "<<a[i].i<<endl; for(int i=1;i<=q;i++) cout<<ans[i]<<endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...