Cod sursa(job #3337792)

Utilizator Darius1414Dobre Darius Adrian Darius1414 Data 30 ianuarie 2026 08:41:52
Problema Distincte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <bits/stdc++.h>
#define nmx 100005
#define mod 666013
using namespace std;
long long n,k,m,v[nmx],arb[4*nmx],prv[nmx],rsp[nmx];
struct edge
{
    int st,dr,i;
};
edge q[nmx];
bool cmp(edge a,edge b)
{
    return a.dr<b.dr;
}
void update(int st,int dr,int index,int pz,long long val)
{
    if (st==dr)
    {
        arb[index]=val;
        return;
    }
    int mid=(st+dr)/2;
    if (pz<=mid)
        update(st,mid,index*2,pz,val);
    else
        update(mid+1,dr,index*2+1,pz,val);
    arb[index]=arb[index*2]+arb[index*2+1];
}
long long query(int st,int dr,int a,int b,int index)
{
    if (a<=st && dr<=b)
        return arb[index];
    if (dr<a || b<st)
        return 0;
    int mid=(st+dr)/2;
    return query(st,mid,a,b,index*2)+query(mid+1,dr,a,b,index*2+1);
}
int main()
{
    ifstream f ("distincte.in");
    ofstream g ("distincte.out");
    f>>n>>k>>m;
    for (int i=1; i<=n; i++)
        f>>v[i];
    for (int i=1; i<=m; i++)
    {
        f>>q[i].st>>q[i].dr;
        q[i].i=i;
    }
    sort (q+1,q+m+1,cmp);
    int i=1;
    for (int j=1; j<=m; j++)
    {
        while (i<=q[j].dr)
        {
            if (prv[v[i]])
                update(1,n,1,prv[v[i]],0);
            prv[v[i]]=i;
            update(1,n,1,i,v[i]);
            i++;
        }
        rsp[q[j].i]=query(1,n,q[j].st,q[j].dr,1);
    }
    for (int i=1; i<=m; i++)
        g<<rsp[i]%mod<<'\n';
}