Cod sursa(job #3131644)

Utilizator cristiana_cocheciCocheci Cristiana cristiana_cocheci Data 20 mai 2023 20:28:32
Problema Distincte Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.91 kb
#include <iostream>
#include <vector>
#include<algorithm>

class arbore
{
private:
    int n;
    std::vector<long long> v;
public:
    void build(int poz, int l, int r, const std::vector<int> &vec)
    {
        if(l==r){
            v[poz]=vec[l];
            return;
        }
        int m=(l+r)/2;
        int lchild=2*poz, rchild=2*poz+1;
        build(lchild,l,m,vec);
        build(rchild,m+1,r,vec);
        v[poz]= v[lchild] + v[rchild];
    }
    arbore(int _n,const std::vector<int> &_v): n(_n), v(4*_n)
    {
        build(1,0,n-1,_v);
    }

    long long query(int l, int r){
        return query(1,0,n-1,l,r);
    }
    void update(int poz, int aux)
    {
        update(1,0,n-1,poz,poz,aux);
    }
    long long query(int poz, int l, int r, int lq, int rq){
        if (lq <= l && r <= rq) {
          return v[poz];
        }
        int m = (l + r) / 2;
        int lsum = 0, rsum = 0;
        if (lq <= m) {
          lsum = query(2 * poz, l, m, lq, rq);
        }
        if (rq > m) {
          rsum = query(2 * poz + 1, m + 1, r, lq, rq);
        }
        return lsum + rsum;
    }
    void update(int poz, int l, int r, int ql, int qr, int aux) {
         if (ql <= l && r <= qr) {
          v[poz]+=aux;
          return;
        }
        int m = (l + r) / 2;
        if (ql <= m) {
          update(2 * poz, l, m, ql, qr, aux);
        }
        if (qr > m) {
          update(2 * poz + 1, m + 1, r, ql, qr, aux);
        }
        int lchild=2*poz, rchild=2*poz+1;
        v[poz]=v[lchild]+v[rchild];
  }
};

bool compar(std::pair<int,std::pair<int,int>> a, std::pair<int,std::pair<int,int>> b)
{
    int x=a.second.second;
    int y=b.second.second;
    if(x<y){
        return 1;
    }
    return 0;
}

int main()
{
    freopen("distincte.in","r",stdin);
    freopen("distincte.out","w",stdout);
    int n,q,k;
    std::cin>> n>>k>>q;
    std::vector<int> v(n);
    arbore AINT(n,v);
    for(int i=0;i<n;i++){
        std::cin>>v[i];
    }
    std::vector<std::pair<int,std::pair<int,int>>> intervale;
    for(int i=0;i<q;i++){
        int l,r;
        std::cin>>l>>r;
        l--;r--;
        intervale.push_back(std::make_pair(i,std::make_pair(l,r)));

    }

    std::sort(intervale.begin(),intervale.end(),compar);


    long long rez[q], ultima_aparitie[k+3];
    for(int i=0;i<k+1;i++)
    {
        ultima_aparitie[i]=-1;
    }
    int j=0;
    for(int i=0;i<n;i++)
    {
        if(ultima_aparitie[v[i]]!=-1){
            AINT.update(ultima_aparitie[v[i]],-v[i]);
        }
        AINT.update(i,v[i]);
        ultima_aparitie[v[i]]=i;
        while(j<q && intervale[j].second.second==i){

            rez[intervale[j].first]=AINT.query(intervale[j].second.first, intervale[j].second.second);
            j++;
        }
    }
    for(int i=0;i<q;i++){
        std::cout<<rez[i]%666013<<"\n";
    }

    return 0;
}