Cod sursa(job #3222015)

Utilizator Theo20067Cismaru Theodor-Alexe Theo20067 Data 8 aprilie 2024 21:16:13
Problema Distincte Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <fstream>
#include <algorithm>
using namespace std;
class OutParser {
private:
    FILE *fout;
    char *buff;
    int sp;

    void write_ch(char ch) {
        if (sp == 50000) {
            fwrite(buff, 1, 50000, fout);
            sp = 0;
            buff[sp++] = ch;
        } else {
            buff[sp++] = ch;
        }
    }


public:
    OutParser(const char* name) {
        fout = fopen(name, "w");
        buff = new char[50000]();
        sp = 0;
    }
    ~OutParser() {
        fwrite(buff, 1, sp, fout);
        fclose(fout);
    }

    OutParser& operator << (int vu32) {
        if (vu32 <= 9) {
            write_ch(vu32 + '0');
        } else {
            (*this) << (vu32 / 10);
            write_ch(vu32 % 10 + '0');
        }
        return *this;
    }

    OutParser& operator << (long long vu64) {
        if (vu64 <= 9) {
            write_ch(vu64 + '0');
        } else {
            (*this) << (vu64 / 10);
            write_ch(vu64 % 10 + '0');
        }
        return *this;
    }

    OutParser& operator << (char ch) {
        write_ch(ch);
        return *this;
    }
    OutParser& operator << (const char *ch) {
        while (*ch) {
            write_ch(*ch);
            ++ch;
        }
        return *this;
    }
};
ifstream fin ("distincte.in");
OutParser fout("distincte.out");
int n,k,m,i,V[100003],f[100003],dr;
long long sol[100003],A[100003];
struct elem
{
    int st,dr,ind;
}Q[100003];
void update(int poz,int val)
{
    if(!poz)
        return;
    for(poz;poz<=n;poz+=(poz&(-poz)))
        A[poz]+=val;
}
long long query(int poz)
{
    if(!poz)
        return 0;
    long long S=0;
    for(poz;poz;poz-=(poz&(-poz)))
        S+=A[poz];
    return S;
}
int main()
{
    fin>>n>>k>>m;
    for(i=1;i<=n;i++)
        fin>>V[i];
    for(i=1;i<=m;i++)
    {
        fin>>Q[i].st>>Q[i].dr;
        Q[i].ind=i;
    }
    sort(Q+1,Q+m+1,[](elem a,elem b){return a.dr<b.dr;});
    dr=1;
    for(i=1;i<=m;i++)
    {
        while(dr<=Q[i].dr)
        {
            update(f[V[dr]],-V[dr]);
            f[V[dr]]=dr;
            update(f[V[dr]],V[dr]);
            dr++;
        }
        sol[Q[i].ind]=query(Q[i].dr)-query(Q[i].st-1);
    }
    for(i=1;i<=m;i++)
        fout<<sol[i]<<"\n";
    return 0;
}