Cod sursa(job #1465415)

Utilizator Liviu98Dinca Liviu Liviu98 Data 27 iulie 2015 12:27:01
Problema Distincte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<stdio.h>
#include<algorithm>
#define NMax 100005
#define MOD 666013
using namespace std;

struct STR{int s,d,indice;} Q[NMax];
int N,M,K;
int a[NMax],pos[NMax],sol[NMax];
long long AIB[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))
     AIB[k]+=val;
}

long long Query(int k)
{
      long long  sum=0;
      for(;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);

    int i,j=1;
    for(int i=1;i<=N && j<=M;i++)
    {
        if(pos[a[i]]) Update(pos[a[i]],-a[i]);
        pos[a[i]]=i;  Update(pos[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();
}