Cod sursa(job #1465403)

Utilizator Liviu98Dinca Liviu Liviu98 Data 27 iulie 2015 12:07:47
Problema Distincte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <iostream>
#include <stdio.h>
#include <algorithm>
#define NMax 100005
#define MOD 666013
using namespace std;
int N,M,K;
int a[NMax],poz[NMax],sol[NMax];
long long AIB[NMax];
struct Str
{
    int s,d,indice;
}Q[NMax];

void Read()
{
    freopen("distincte.in","r",stdin);
    scanf("%d%d%d",&N,&K,&M);
    for(int i=1;i<=N;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=M;i++)
    {
        scanf("%d %d",&Q[i].s,&Q[i].d);
        Q[i].indice=i;
    }
}

void Update(int k,int val)
{
    for(;k<=N;k=k+k&(-k))
        AIB[k]+=val;
}

long long Query(int k)
{
    long long sum=0;
    for(;k;k=k-k&(-k))
        sum=sum+AIB[k];
    return sum;
}

bool comp(const Str &a,const Str &b)
{
    return a.d<b.d;
}

void Solve()
{
    sort(Q+1,Q+M+1,comp);

    for(int i=1,j=1;i<=N && j<=M;i++)
    {
        if(poz[a[i]])
            Update(poz[a[i]],-a[i]);
        poz[a[i]]=i;
        Update(poz[a[i]],a[i]);

        while(i==Q[j].d && j<=M)
        {
            sol[Q[j].indice]=(Query(i)-Query(Q[j].s-1))%MOD;
            j++;
        }
    }
    freopen("distincte.out","w",stdout);
    for(int i=1;i<=M;i++)
        printf("%d\n",sol[i]);
}

int main()
{
    Read();
    Solve();
}