Cod sursa(job #3206490)

Utilizator antonio_sefu_tauLaslau Antonio antonio_sefu_tau Data 23 februarie 2024 00:11:16
Problema Distincte Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <bits/stdc++.h>
using namespace std;
const int dim=2e5+5;
const int mod=666013;
int n,k,m,a[dim],lpoz[dim],sol[dim];
long long aint[4*dim],s;
struct el{
    int x,y,idx;
}q[dim];
bool cmp(el A, el B){
    if(A.y==B.y){
        return A.x<A.y;
    }
    return A.y<B.y;
}
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]+aint[2*nod+1];
        aint[nod]%=mod;
    }
}
void Query(int nod, int st, int dr, int x, int y){
    if(x<=st and dr<=y){
        s+=aint[nod];
        s%=mod;
    }
    else{
        int mid=(st+dr)/2;
        if(x<=mid){
            Query(2*nod,st,mid,x,y);
        }
        if(y>mid){
            Query(2*nod+1,mid+1,dr,x,y);
        }
    }
}
signed 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].x>>q[i].y;
        q[i].idx=i;
    }
    sort(q+1,q+m+1,cmp);
    int p=1;
    for(int i=1;i<=m;i++){
        while(p<=q[i].y){
            if(lpoz[a[p]]){
                Update(1,1,n,lpoz[a[p]],0);
            }
            lpoz[a[p]]=p;
            Update(1,1,n,p,a[p]);
            p++;
        }
        s=0;
        Query(1,1,n,q[i].x,q[i].y);
        sol[q[i].idx]=s;
    }
    for(int i=1;i<=m;i++){
        g<<sol[i]<<'\n';
    }
    return 0;
}