Cod sursa(job #3166320)

Utilizator emazareMazare Emanuel emazare Data 8 noiembrie 2023 16:03:48
Problema Distincte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("distincte.in");
ofstream fout("distincte.out");

const int Nmax = 100005, NR = 666013;
int n,aib[Nmax],v[Nmax],last[Nmax],ll[Nmax];
struct question{
    int st;
    int dr;
    int pos;
    int ans;
} q[Nmax];
bool cmp1(question a, question b){
    return(a.dr<b.dr);
}
bool cmp2(question a, question b){
    return(a.pos<b.pos);
}
int mod(int x){
    int r = x%NR;
    if(r>=0)
        return r;
    r+=NR;
    return r;
}
void update(int x, int y){
    for(int i=x;i<=n;i+=(i&(-i))){
        aib[i]+=y;
        aib[i] = mod(aib[i]);
    }
}
int query(int x){
    if(x == 0)
        return 0;
    int s = 0;
    for(int i=x;i>0;i-=(i&(-i))){
        s+=aib[i];
        s = mod(s);
    }
    return s;
}

int main()
{
    int k,m,i,j;
    fin >> n >> k >> m;
    for(i=1;i<=n;i++){
        fin >> v[i];
        update(i,v[i]);
    }
    for(i=1;i<=m;i++){
        fin >> q[i].st >> q[i].dr;
        q[i].pos = i;
    }
    sort(q+1,q+m+1,cmp1);
    for(i=1;i<=k;i++)
        ll[i] = -1;
    for(i=1;i<=n;i++)
        last[i] = -1;
    for(i=1;i<=n;i++){
        if(ll[v[i]]!=-1)
            last[i] = ll[v[i]];
        ll[v[i]] = i;
    }
    j = 1;
    for(i=1;i<=m;i++){
        while(j<=q[i].dr){
            if(last[j]!=-1)
                update(last[j],-v[j]);
            j++;
        }
        q[i].ans = query(q[i].dr)-query(q[i].st-1);
        q[i].ans = mod(q[i].ans);
    }
    sort(q+1,q+m+1,cmp2);
    for(i=1;i<=m;i++)
        fout << q[i].ans << '\n';
    return 0;
}