Cod sursa(job #3206539)

Utilizator antonio_sefu_tauLaslau Antonio antonio_sefu_tau Data 23 februarie 2024 13:24:58
Problema Distincte Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <bits/stdc++.h>
using namespace std;
const int dim=1e5+5;
const int mod=666013;
int n,k,m,a[dim],p=1,lpoz[dim],aint[dim],sol[dim];
struct el{
    int st,dr,idx;
}q[dim];
bool cmp(el A, el B){
    return A.dr<B.dr;
}
void Update(int nod, int st, int dr, int poz, int val){
    if(st==dr){
        aint[nod]=val;
    }
    else{
        int mid=(st+dr)/2;
        if(poz<=mid){
            Update(2*nod,st,mid,poz,val);
        }
        if(poz>mid){
            Update(2*nod+1,mid+1,dr,poz,val);
        }
        aint[nod]=aint[2*nod]%mod+aint[2*nod+1]%mod;
        aint[nod]%=mod;
    }
}
int Query(int nod, int st, int dr, int x, int y){
    if(x<=st and dr<=y){
        return aint[nod];
    }
    else{
        int mid=(st+dr)/2,s1=0,s2=0;
        if(x<=mid){
            s1=Query(2*nod,st,mid,x,y);
        }
        if(y>mid){
            s2=Query(2*nod+1,mid+1,dr,x,y);
        }
        return (s1%mod+s2%mod)%mod;
    }
}
int main(){
    ifstream f("distincte.in");
    ofstream g("distincte.out");
    f>>n>>k>>m;
    for(int i=1;i<=n;i++){
        f>>a[i];
    }
    for(int i=1;i<=m;i++){
        f>>q[i].st>>q[i].dr;
        q[i].idx=i;
    }
    sort(q+1,q+m+1,cmp);
    for(int i=1;i<=m;i++){
        while(p<=q[i].dr){
            if(lpoz[a[p]]){
                Update(1,1,n,lpoz[a[p]],0);
            }
            lpoz[a[p]]=p;
            Update(1,1,n,p,a[p]);
            p++;
        }
        sol[q[i].idx]=Query(1,1,n,q[i].st,q[i].dr);
    }
    for(int i=1;i<=m;i++){
        g<<sol[i]<<'\n';
    }
    return 0;
}