Submission #704409

#TimeUsernameProblemLanguageResultExecution timeMemory
704409PacybwoahOsumnjičeni (COCI21_osumnjiceni)C++14
110 / 110
930 ms74636 KiB
#include<iostream> #include<vector> #include<algorithm> #include<utility> #define ll long long using namespace std; struct node{ ll val,tag; }; vector<node> seg; void push(ll l,ll r,int ind){ if(l==r) return; ll mid=(l+r)>>1; seg[ind*2].val+=(mid-l+1)*seg[ind].tag; seg[ind*2+1].val+=(r-mid)*seg[ind].tag; seg[ind*2].tag+=seg[ind].tag; seg[ind*2+1].tag+=seg[ind].tag; seg[ind].tag=0; } ll query(ll l,ll r,int start,int end,int ind){ if(r<start||end<l) return 0; if(start<=l&&r<=end){ return seg[ind].val; } ll mid=(l+r)>>1; push(l,r,ind); return query(l,mid,start,end,ind*2)+query(mid+1,r,start,end,ind*2+1); } void modify(ll l,ll r,int start,int end,ll num,int ind){ if(r<start||end<l) return; if(start<=l&&r<=end){ seg[ind].val+=(r-l+1)*num; seg[ind].tag+=num; return; } ll mid=(l+r)>>1; push(l,r,ind); modify(l,mid,start,end,num,ind*2); modify(mid+1,r,start,end,num,ind*2+1); seg[ind].val=(seg[ind*2].val+seg[ind*2+1].val); } int main(){ ios::sync_with_stdio(false); cin.tie(0); int n,q; cin>>n; vector<pair<ll,ll>> vec(n+1); for(int i=1;i<=n;i++) cin>>vec[i].first>>vec[i].second; vector<ll> cc; for(int i=1;i<=n;i++){ cc.push_back(vec[i].first); cc.push_back(vec[i].second); } sort(cc.begin(),cc.end()); cc.resize(unique(cc.begin(),cc.end())-cc.begin()); for(int i=1;i<=n;i++){ vec[i].first=lower_bound(cc.begin(),cc.end(),vec[i].first)-cc.begin()+1; vec[i].second=lower_bound(cc.begin(),cc.end(),vec[i].second)-cc.begin()+1; } vector<int> far(n+1); seg.resize(4*cc.size()+4); ll len=cc.size()+1; int ii=1; for(int i=1;i<=n;i++){ while(ii<=n&&query(1,len,vec[ii].first,vec[ii].second,1)==0) modify(1,len,vec[ii].first,vec[ii].second,1,1),ii++; far[i]=ii; modify(1,len,vec[i].first,vec[i].second,-1,1); } vector<vector<ll>> far2(n+1,vector<ll>(19)); for(int i=1;i<=n;i++){ far2[i][0]=far[i]; } for(int i=1;i<19;i++){ for(int j=1;j<=n;j++){ if(far2[j][i-1]==n+1) far2[j][i]=n+1; else far2[j][i]=far2[far2[j][i-1]][i-1]; } } int a,b; cin>>q; for(int i=0;i<q;i++){ cin>>a>>b; int ans=1; for(int j=18;j>=0;j--){ if(far2[a][j]<=b){ a=far2[a][j]; ans+=(1<<j); } } cout<<ans<<"\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...