제출 #1124795

#제출 시각아이디문제언어결과실행 시간메모리
1124795ducanh0811Poklon (COCI17_poklon)C++20
28 / 140
186 ms22684 KiB
#include <bits/stdc++.h>
#define     debug(x)        cout << #x << " = " << x << '\n'
#define     int             long long
#define     pii             pair<int, int>
#define     fi              first
#define     se              second
#define     pb              push_back
#define     eb              emplace_back
#define     ALL(x)          x.begin(), x.end()
#define     MASK(i)         (1ll << (i))
#define     FOR(i,a,b)      for (int i = (a); i <= (b); ++i)
#define     REV(i,a,b)      for (int i = (a); i >= (b); --i)
using namespace std;

int n, q;
#define MAXN 500005
int a[MAXN];

struct query{
    int l,r,i;
};

int SIZE = 707;

vector<query> Q;

int bid(int id){
    return id / SIZE;
}

int res[MAXN];
int cnt[MAXN];

int ANS = 0;

void compress(){
    vector<int> nenso;
    FOR(i,0,n-1) nenso.pb(a[i]);
    sort(ALL(nenso));
    int cur = nenso[0];
    int cnt = 1;
    map<int,int>mp;
    for (int &x : nenso){
        if (cur != x) cur = x, cnt++;
        mp[cur] = cnt;
    }
    FOR(i,0,n-1) a[i] = mp[a[i]];
}

void inc(int x){
    if (cnt[x] == 2) ANS--;
    if (cnt[x] == 1) ANS++;
    cnt[x]++;
}

void dec(int x){
    if (cnt[x] == 2) ANS--;
    if (cnt[x] == 3) ANS++;
    cnt[x]--;
}

void solve(){
    cin >> n >> q;
    FOR(i,0,n-1) cin >> a[i];
    compress();
    FOR(i,1,q){
        int x,y; cin >> x >> y;
        x--; y--;
        Q.push_back({x,y,i});
    }
    sort(ALL(Q),[](const query&A, const query&B){
        if (bid(A.l) != bid(B.l)) return bid(A.l) < (B.l);
        return bid(A.l) & 1 ? A.r < B.r : A.r > B.r;
    });

    int ll = Q[0].l;
    int rr = Q[0].r;

    FOR(i,ll,rr){
        inc(a[i]);
    }

    res[Q[0].i] = ANS;

    FOR(i,1,q-1){
        while (ll > Q[i].l) ll--, inc(a[ll]);
        while (ll < Q[i].l) dec(a[ll]), ll++;
        while (rr > Q[i].r) dec(a[rr]), rr--;
        while (rr < Q[i].r) rr++, inc(a[rr]);
        res[Q[i].i] = ANS;
    }

    FOR(i,1,q){
        cout << res[i] << '\n';
    }

}

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(__null); cout.tie(__null);
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...