Cod sursa(job #3131803)

Utilizator fabian_anghelFabian Anghel fabian_anghel Data 21 mai 2023 16:35:47
Problema Distincte Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <vector>
using namespace std;
long long N,M,v[100001],K,arb[400001],sol[100001],a,b,previ[100001];
vector <pair<int,int>> query_list[100001];
ifstream f ("distincte.in");
ofstream g ("distincte.out");
void upd(int nod, int st, int dr, int p, int val)
{
    if(st==dr)
        arb[nod]=val;
    else
    {
        int mij=(st+dr)/2;
        if(p<=mij)
            upd(2*nod,st,mij,p,val);
        else
            upd(2*nod+1,mij+1,dr,p,val);
        arb[nod]=arb[2*nod]+arb[2*nod+1];
    }
}
long long query(int nod, int st, int dr, int a, int b)
{
    if(a<=st && dr<=b)
        return arb[nod];
    else
    {
        int mij=(st+dr)/2;
        if(b<=mij)
            return query(2*nod,st,mij,a,b);
        else if(a>mij)
            return query(2*nod+1,mij+1,dr,a,b);
        else
            return query(2*nod,st,mij,a,b)+query(2*nod+1,mij+1,dr,a,b);
    }
}
int main()
{
    f>>N>>K>>M;
    for(int i=1;i<=N;i++)
        f>>v[i];
    for(int i=1;i<=M;i++)
    {
        f>>a>>b;
        query_list[b].push_back({a,i});
    }
    for(int i=1;i<=N;i++)
    {
        upd(1,1,N,i,v[i]);
        if(previ[v[i]])
            upd(1,1,N,previ[v[i]],0);
        previ[v[i]]=i;
        int n=query_list[i].size();
        for(int j=0;j<n;j++)
            sol[query_list[i][j].second]=query(1,1,N,query_list[i][j].first,i);
    }
    for(int i=1;i<=M;i++)
        g<<sol[i]<<'\n';
    f.close();
    g.close();
    return 0;
}