Submission #1331832

#TimeUsernameProblemLanguageResultExecution timeMemory
1331832hrantsargsyanPoklon (COCI17_poklon)C++20
84 / 140
5093 ms8456 KiB
#include <iostream>
#include <map>
#include <algorithm>
#include <cmath>
using namespace std;

using namespace std;

const int N = 5e5 + 5;
int block = 0;


int a[N], ans[N], finalans[N];
int currans = 0;
map<int, int> cnt;

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

query queries[N];

bool cmp(query q1, query q2)
{
    long long block1 = q1.l / block;
    long long block2 = q2.l / block;
    if (block1 != block2)
    {
        return block1 < block2;
    }
    else if (q1.r != q2.r)
    {
        return q1.r < q2.r;
    }
    else
        return q1.ind < q2.ind;
}
void add(int i)
{
    cnt[a[i]]++;
    if (cnt[a[i]] == 2)
    {
        currans++;
    }
    else if (cnt[a[i]]==3)
    {
        --currans;
    }
}
void del(int i)
{
    cnt[a[i]]--;
    if (cnt[a[i]]==1)
    {
        --currans;
    }
    if (cnt[a[i]] == 2)
    {
        ++currans;
    }
}
long long move(int l1, int r1, int l2, int r2)
{
    while (r1 < r2)
    {
        ++r1;
        add(r1);
    }
    while (l1 > l2)
    {
        --l1;
        add(l1);
    }
    while (l1 < l2)
    {
        del(l1);
        ++l1;
    }
    while (r1 > r2)
    {
        del(r1);
        --r1;
    }
   
    return currans;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n,q;
    cin >> n >> q;
    block = (n/(int)sqrt(q));
    for (int i = 0;i < n;++i)
    {
        cin >> a[i];
    }
    for (int i = 0;i < q;++i)
    {
        int l, r;
        cin >> l >> r;
        --l;
        --r;
        queries[i].l = l;
        queries[i].r = r;
        queries[i].ind = i;
    }
    sort(queries, queries + q, cmp);
    int l0 = queries[0].l;
    int r0 = queries[0].r;
    for (int i = l0;i <= r0;++i)
    {
        cnt[a[i]]++;
        if (cnt[a[i]] == 3)
            --currans;
        else if (cnt[a[i]] == 2)
            ++currans;
    }
    ans[0] = currans;
    for (int i = 1;i < q;++i)
    {
        int l1 = queries[i-1].l;
        int r1 = queries[i-1].r;
        int l2 = queries[i].l;
        int r2 = queries[i].r;
        ans[i]=move(l1, r1, l2, r2);
    }
    for (int i = 0;i < q;++i)
    {
        finalans[queries[i].ind] = ans[i];
    }
    for (int i = 0;i < q;++i)
    {
        cout << finalans[i] << endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...