Submission #157191

#TimeUsernameProblemLanguageResultExecution timeMemory
157191puppies_and_rainbowsExamination (JOI19_examination)C++14
100 / 100
2605 ms441588 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3") #define left dhusiad #define right dusanan using namespace std; pair<int, int> a[1000005], cursort[1000005]; int it[400005], root[400005]; int it1[10000005], left[10000005], right[10000005]; vector<int> check[10000005]; int cntnode=0, ans, ans1; int n; int itgen(int l, int r) { if(l>r) return 0; cntnode++; int id=cntnode; for(int i=l; i<=r; i++) { check[id].push_back(cursort[i].second); } it1[id]=cursort[r].first; sort(check[id].begin(), check[id].end()); int mid=(l+r)/2; if(l==r) return id; left[id]=itgen(l, mid); right[id]=itgen(mid+1, r); return id; } void build_tree(int id, int l, int r) { // cout<<"DEBUG "<<l<<" "<<r<<endl; for(int i=l; i<=r; i++) { cursort[i]={a[i].second, a[i].first+a[i].second}; // cout<<cursort[i].first<<" "<<cursort[i].second<<endl; } // cout<<endl; sort(cursort+l, cursort+r+1); // for(int i=l; i<=r; i++) // { // cout<<cursort[i].first<<" "<<cursort[i].second<<endl; // } // cout<<endl; root[id]=itgen(l, r); if(l==r) it[id]=a[l].first; else { int mid=(l+r)/2; build_tree(id*2, l, mid); build_tree(id*2+1, mid+1, r); it[id]=max(it[id*2], it[id*2+1]); } } void solvehave(int ok, int y, int z, int l, int r) { // cout<<l<<" "<<r<<" "<<ans1<<endl; int id=root[ok]; while(l<r) { int mid=(l+r)/2; if(it1[left[id]]>=y) { ans1+=(int)(check[right[id]].end()-lower_bound(check[right[id]].begin(), check[right[id]].end(), z)); id=left[id]; r=mid; } else { id=right[id]; l=mid+1; } } if(it1[id]>=y&&check[id][0]>=z) ans1++; // cout<<ans1<<endl; } void solvefail(int id, int z) { return; ans+=check[root[id]].end()-lower_bound(check[root[id]].begin(), check[root[id]].end(), z); } bool checkk(int id, int x, int y, int z) { if(a[id].first>=x&&a[id].second>=y&&a[id].first+a[id].second>=z) return true; return false; } int solve(int x, int y, int z) { ans=0, ans1=0; int id=1, l=1, r=n; while(l<r) { int mid=(l+r)/2; if(it[id*2]>=x) { solvehave(id*2+1, y, z, mid+1, r); id*=2; r=mid; } else { solvefail(id*2, z); id=id*2+1; l=mid+1; } } if(checkk(l, x, y, z)) { ans++; } return ans+ans1; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int q; cin>>n>>q; for(int i=1; i<=n; i++) { cin>>a[i].first>>a[i].second; } sort(a+1, a+n+1); build_tree(1, 1, n); // cout<<1<<endl; // return 0; int x, y, z; for(int i=1; i<=q; i++) { cin>>x>>y>>z; cout<<solve(x, y, z)<<endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...