Submission #1314933

#TimeUsernameProblemLanguageResultExecution timeMemory
1314933exoworldgdFish (IOI08_fish)C++20
100 / 100
489 ms36032 KiB
#pragma GCC optimize("O5,unroll-loops,inline,fast-math")
#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
#include <bits/stdc++.h>
#define int long long
#define exoworldgd cin.tie(0)->sync_with_stdio(0), cout.tie(0)
using namespace std;
const int K=1<<20,N=5e5+5;
int n,k,mod,a[N],b[N],ord[N],last[N],nxt[N],cnt,ans,ok[N];
pair<int,int> p[N];
struct segTree{
    int t[K];
    void build(int l,int r,int i){
        t[i]=1;
        if(l==r)return;
        int m=(l+r)/2;
        build(l,m,i*2), build(m+1,r,i*2+1);
    }
    void build(){build(1,k,1);}
    void update(int l,int r,int i,int x,int v){
        if(x<l||r<x)return;
        if(l==r)return void(t[i]=(t[i]+v)%mod);
        int m=(l+r)/2;
        update(l,m,i*2,x,v), update(m+1,r,i*2+1,x,v), t[i]=t[i*2]*t[i*2+1]%mod;
    }
    void update(int x,int v){update(1,k,1,x,v);}
    int query(int l,int r,int i,int x,int y){
        if(y<l||r<x)return 1;
        if(x<=l&&r<=y)return t[i];
        int m=(l+r)/2;
        return query(l,m,i*2,x,y)*query(m+1,r,i*2+1,x,y)%mod;
    }
    int query(int x,int y){return query(1,k,1,x,y);}
}seg;
signed main(void) {
    exoworldgd;
    cin >> n >> k >> mod;
    for(int i=1;i<=n;i++)cin >> p[i].first >> p[i].second;
    sort(p+1,p+n+1);
    cnt=k;
    for(int i=n;i>=1;i--){
        auto [l,t]=p[i];
        if(!ord[t]) b[cnt]=l, ord[t]=cnt, last[t]=l, ok[i]=1, cnt--;
        nxt[i]=last[t], last[t]=l;
    }
    seg.build();
    for(int i=1,j=1,x;i<=n;i++)if(ok[i]){
        auto [l,t]=p[i];
        while(j<=n&&l>=p[j].first*2)x=p[j].second, seg.update(ord[x],1), last[x]=nxt[j], j++;
        ans+=seg.query(1,ord[t]), ans+=mod+seg.query(1,ord[t]-1)*(seg.query(ord[t]+1,lower_bound(b+1,b+k+1,last[t]*2)-b-1)-1), ans%=mod;
    }
    cout << ans;
}
#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...
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...