Cod sursa(job #1789621)

Utilizator andreeainfo_dAndreea Dutulescu andreeainfo_d Data 27 octombrie 2016 11:47:43
Problema Distincte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>

using namespace std;
int ;
struct andreea
{
    int s,d,ind;
}q[100003];
bool cmp(andreea a, andreea b)
{
    if(a.d<b.d)return 0;
    return 1;aint[nod]=aint[nod*2]+aint[nod*2+1];
}
void update(int nod, int st, int dr, int poz, int val)
{
    int mij;
    if(st==dr)
    {
        aint[nod]=val;
        return ;
    }
    mij=(st+dr)/2;
    if(poz<=mij)update(nod*2,st,mij,poz,val);
    else update(nod*2+1,mij+1,dr,poz,val);
    aint[nod]=(aint[nod*2]+aint[nod*2+1])%666013;
}
void query(int nod, int st, int dr, int x, int y)
{
    int mij;
    if(x<=st&&y>=dr)
    {
        sol=sol+aint[nod];
        return ;
    }
    mij=(st+dr)/2;
    if(x<=mij)update(nod*2,st,mij,x,y);
    if(y>=mij+1) update(nod*2+1,mij+1,dr,x,y);
}
int main()
{
    freopen("distincte.in","r",stdin);
    freopen("distincte.out","w",stdout);
    scanf("%d%d%d",&n,&k,&m);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(i=1;i<=n;i++)
    {
        prec[i]=v[a[i]];
        v[a[i]]=i;
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&q[i].s,&q[i].d);
        q[i].ind=i;
    }
    sort(q+1,q+m+1,cmp);
    for(i=n;i>=1;i--)
    {
        v[i]=0;
    }
    for(i=n;i>=1;i--)
    {
        if(v[a[i]]==0)
        {
            update(1,1,n,i,a[i]);
            v[a[i]]=1;
        }
    }
    p=n;
    for(i=1;i<=m;i++)
    {
        while(p>q[i].dr)
        {
            if(prec[p]>0)update(1,1,n,prec[p],a[prec[p]]);
            p--;
        }
            ras=0;
            sol=0;
            query(1,1,n,1,dr);
            ras=sol;
            sol=0;
            query(1,1,n,1,st-1);
            ras=ras-sol;
            if(ras<0)ras=ras+666013;
        raspuns[q[i].ind]=ras;
    }
    for(i=1;i<=m;i++)
        printf("%d\n",raspuns[i]);
    return 0;
}