| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 964804 | shezitt | Poklon (COCI17_poklon) | C++14 | 432 ms | 65892 KiB | 
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
#include <numeric>
#include <array>
using namespace std;
using ll = long long;
#define int ll
#define vi vector<int>
#define fore(i, a, b) for(int i=a; i<b; ++i)
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define pb push_back
#define endl '\n'
const int N = 5e5+5;
struct fenwick {
    int n;
    vi t;
    fenwick(int nn){
        n = nn;
        t.assign(n+1, 0);
    }
    void add(int i, int val=1){
        for(; i<=n; i+=i&-i){
            t[i] += val;
        }
    }
    int query(int i){
        int r = 0;
        while(i > 0){
            r += t[i];
            i -= i & -i;
        }
        return r;
    }
};
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n, q;
    cin >> n >> q;
    vi a(n+1);
    fore(i, 1, n+1){
        cin >> a[i];
    }
    // compression
    vi A = a;
    sort(all(A));
    A.erase(unique(all(A)), A.end());
    fore(i, 1, n+1){
        a[i] = lower_bound(all(A), a[i]) - A.begin() + 1;
    }
    fenwick dos(n+1), tres(n+1);
    vector<array<int,3>> last(n+1, {-1, -1, -1});
    vi ans(q);
    vector<vector<pair<int,int>>> queries(n+1);
    fore(i, 0, q){
        int l, r;
        cin >> l >> r;
        queries[r].pb({l, i});
    }
    fore(r, 1, n+1){
        int x = a[r];
        auto &[o, p, q] = last[x];
        if(q == -1){
            q = r;
        }
        else if(p == -1){
            p = q;
            q = r;
            dos.add(p);
        }
        else if(o == -1){
            dos.add(p, -1);
            o = p;
            p = q;
            dos.add(p);
            tres.add(o);
            q = r;
        }
        else {
            dos.add(p, -1);
            tres.add(o, -1);
            o = p;
            p = q;
            dos.add(p);
            tres.add(o);
            q = r;
        }
        for(auto [l, j] : queries[r]){
            int res = dos.query(r) - dos.query(l-1);
            res -= tres.query(r) - tres.query(l-1);
            ans[j] = res;
        }
    }
    fore(i, 0, q){
        cout << ans[i] << endl;
    }
}
Compilation message (stderr)
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
