Cod sursa(job #1328070)

Utilizator MKLOLDragos Ristache MKLOL Data 27 ianuarie 2015 23:47:49
Problema Distincte Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<map>
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
#define fs first
#define sc second
#define mp make_pair
pair<int,int> qu[101010];
int v[101010];
pair<int,int> rq[101010];
map<pair<int,int>,int> hv;

long long AIB[202020];
int N,M,K;
inline int zeros(int x)
{
return ((x ^ (x - 1)) & x );
}
 
inline void Add(int x, int q)
{
    int i;
 
    for (i = x; i <= N; i += zeros(i))
        AIB[i]+=q;
}
 
inline long long comp(int x)
{
    long long i, ret = 0;
 
    for (i = x; i > 0; i -= zeros(i))
        ret += AIB[i];
    return ret;
}
inline int comp(int x,int y){
  return (comp(y) - comp(x-1)) % 666013;
}
int cmp(pair<int,int> x,pair<int,int> y){
  return x.sc < y.sc;
}
int start = 1;
int loc[101010];
int move(int x){
  for(;start<=x;++start){
    if(loc[v[start]] != 0){
      Add(loc[v[start]], - v[start]);
    }
    loc[v[start]] = start;
    Add(loc[v[start]], v[start]);
  }
}
int main(){
  freopen("distincte.in","r",stdin);
  freopen("distincte.out","w",stdout);
  scanf("%d%d%d",&N,&K,&M);
  for(int i=1;i<=N;++i){
    scanf("%d",&v[i]);
  }
  for(int i=1;i<=M;++i){
    scanf("%d%d",&qu[i].fs,&qu[i].sc);
    rq[i]=qu[i];
  }
  sort(qu+1,qu+M+1,cmp);
  for(int i=1;i<=M;++i){
    move(qu[i].sc);
    //printf("%d %d\n",qu[i].fs,qu[i].sc);
    hv[qu[i]] = comp(qu[i].fs,qu[i].sc);
  }
  for(int i=1;i<=M;++i){
    printf("%d\n",hv[rq[i]]);
  }

}