Cod sursa(job #3182426)

Utilizator matei8787Matei Dobrea matei8787 Data 8 decembrie 2023 22:24:34
Problema Distincte Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb
#include<bits/stdc++.h>
using namespace std;
ifstream in("distincte.in");
ofstream out("distincte.out");
const int N = 100005;
struct Query
{
    int st, dr, poz;
};
int aint[N*4],n,m,k,poz[N],v[N];
Query q[N];
void citire()
{
    in>>n>>k>>m;
    for ( int i = 1 ; i <= n ; i++ )
    {
        in>>v[i];
    }
    for ( int i = 1 ; i <= m ; i++ )
    {
        in>>q[i].st>>q[i].dr;
        q[i].poz = i;
    }
}
int fs(int nod) { return nod * 2; }
int fd(int nod) { return nod * 2 + 1; }
void update_interval(int nod, int st, int dr, int qs, int qd, int val)
{
    if ( qs <= st && dr <= qd )
    {
        aint[nod] += val;
        return;
    }
    if ( st > qd || qs > dr )
    {
        return;
    }
    int mij = ( st + dr ) / 2;
    if ( qs <= mij )
        update_interval(fs(nod), st, mij, qs, qd, val);
    if ( mij < qd )
        update_interval(fd(nod), mij + 1, dr, qs, qd, val);
}
int query_poz(int nod, int st, int dr, int poz)
{
    if ( st == dr )
    {
        return aint[nod];
    }
    int mij = ( st + dr ) / 2;
    if ( poz <= mij )
        return query_poz(fs(nod), st, mij, poz) + aint[nod];
    return query_poz(fd(nod), mij + 1, dr, poz) + aint[nod];
}
int query(int st, int dr)
{
    int aux;
    if ( st == 1 )
        aux = 0;
    else
        aux = query_poz(1, 1, n, st - 1);
    return query_poz(1, 1, n, dr) - aux;
}
bool cmp(Query a, Query b)
{
    return a.dr < b.dr;
}
void rez()
{
    sort ( q + 1, q + m + 1 , cmp );
    int dr = 1;
    vector<int> ans(m+1);
    for ( int i = 1 ; i <= m ; i++ )
    {
        while ( dr <= q[i].dr )
        {
            if ( poz[v[dr]] )
            {
                update_interval(1, 1, n, poz[v[dr]], n, -v[dr]);
            }
            poz[v[dr]] = dr;
            update_interval(1, 1, n, dr, n, v[dr]);
            dr++;
        }
        ans[q[i].poz] = query(q[i].st, q[i].dr);
    }
    for ( int i = 1 ; i <= m ; i++ )
    {
        out<<ans[i]<<'\n';
    }
}
int main()
{
    citire();
    rez();
    return 0;
}