Cod sursa(job #3132628)

Utilizator MarutBrabete Marius Stelian Marut Data 23 mai 2023 12:21:26
Problema Distincte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<bits/stdc++.h>
const int NMAX = 100000, MOD = 666013;
long long aint[NMAX*4+4],ans[NMAX+4],last[NMAX+4],v[NMAX+4];
std::vector<std::pair<int,int>>queries[100001];
void update(int nod, int st, int dr, int pos, int val)
{
    if(st==dr) aint[nod]=val;
        else
        {
            int med=(st+dr)>>1;
            if(pos<=med) update(2*nod,st,med,pos,val);
                else update(2*nod+1,med+1,dr,pos,val);
            aint[nod]=aint[2*nod]+aint[2*nod+1];
        }
}
long long query(int nod, int st, int dr, int stt, int drr)
{
    if(stt<=st && dr<=drr) return aint[nod];
        else
        {
            int med=(st+dr)>>1;
            if(drr<=med) return query(2*nod,st,med,stt,drr);
                else if(stt>med) return query(2*nod+1,med+1,dr,stt,drr);
            return query(2*nod,st,med,stt,drr)+query(2*nod+1,med+1,dr,stt,drr);
        }
}
int main()
{
    freopen("distincte.in","r",stdin);
    freopen("distincte.out","w",stdout);
    int n,m,k;
    scanf("%d%d%d",&n,&k,&m);
    for(register int i=1;i<=n;i++)
        scanf("%lld",&v[i]);
    for(register int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        queries[y].push_back({x,i});
    }
    for(register int i=1;i<=n;i++)
    {
        update(1,1,n,i,v[i]);
        if(last[v[i]]!=0) update(1,1,n,last[v[i]],0);
        last[v[i]]=i;
        for(register int j=0;j<queries[i].size();j++)
            ans[queries[i][j].second] = query(1,1,n,queries[i][j].first,i) % MOD;
    }
    for(register int i=1;i<=m;i++)
        printf("%lld\n",ans[i]);
    return 0;
}