Cod sursa(job #1468043)

Utilizator andreey_047Andrei Maxim andreey_047 Data 5 august 2015 09:09:03
Problema Distincte Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <cstdio>
#include <vector>
#define nmax 110005

using namespace std;

int a[nmax],v[nmax],N,K,Q,AIB[nmax],urm[nmax],sol[nmax];

struct Coord{
 int poz,dr;
};
vector<Coord>C[nmax];
vector<Coord>::iterator it;

inline void Update(int x, int poz){
 for(int i = poz; i <= N; i+=(i&-i))
    AIB[i]+=x;
}
inline int Compute(int x){
  int s=0;
 for(int i = x; i; i-=(i&-i))
    s=(s+AIB[i])%666013;
 return s;
}
int main(){
    int i,l,r;
    Coord w;
    freopen("distincte.in","r",stdin);
    freopen("distincte.out","w",stdout);

    scanf("%d%d%d\n",&N,&K,&Q);
    for(i = 1; i <= N; ++i)
        scanf("%d\n",&a[i]);

    for(i = N; i; --i){
        if(!v[a[i]]) urm[i] = N+1;
        else urm[i] = v[a[i]];

        v[a[i]] = i;
    }

    for(i = 1; i <= Q; ++i){
        scanf("%d%d\n",&l,&r);
        w.poz = i,w.dr = r;
        C[l].push_back(w);
    }
    for(i = 1; i <= N; ++i)
        if(urm[i] <= N && a[urm[i]] != a[i]) while(2);
    for(i = N; i; --i){
        Update(a[i],i);
        Update(-a[i],urm[i]);

      for(it = C[i].begin();it!=C[i].end();++it)
        sol[it->poz] = Compute(it->dr) - Compute(i-1);
    }
     for(i=1;i<=Q;++i)
        printf("%d\n", sol[i]);

    return 0;
}