Cod sursa(job #1293029)

Utilizator bulbulicaAlexandrescu Cristian bulbulica Data 15 decembrie 2014 10:46:36
Problema Distincte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define DimMax 400200
using namespace std;
ifstream f("distincte.in");
ofstream g("distincte.out");

const int NMAX=100010;

int N,M,K,x[NMAX],vec[DimMax],raspuns[NMAX];
vector<int> Poz[NMAX];
pair<pair<int,int>,int> Q[NMAX];

void actualizare(int nod,int st, int dr,int poz,int val)
{
    if (st==dr)
    {
        vec[nod]=val;
        return;
    }
    int mij=(st+dr)/2;
    if (poz<=mij)
        actualizare(2*nod,st,mij,poz,val);
    else
        actualizare(2*nod+1,mij+1,dr,poz,val);
    vec[nod]=(vec[2*nod]+vec[2*nod+1])%666013;
}
int interogare(int nod,int st,int dr,int inceput,int final)
{
    if (inceput==st && final==dr)
        return vec[nod];
    int mij =(st+dr)/2;
    if (final<=mij)
        return interogare(2*nod,st,mij,inceput,final);
    else if (inceput>mij)
        return interogare(2*nod+1,mij+1,dr,inceput,final);
    else
        return (interogare(2*nod,st,mij,inceput,mij)+interogare(2*nod+1,mij+1,dr,mij+1,final))%666013;
}
void creare(int n)
{
    for (int i=1;i<=n;++i)
        x[i]=i;
}
int main()
{
    int i,q;
    f>>N>>K>>M;
    for (i=1;i<=N;++i)
    {
        f>>x[i];
        Poz[x[i]].push_back(i);
    }
    for (i=1;i<=M;++i)
    {
        f>>Q[i].first.first>>Q[i].first.second;
        Q[i].second=i;
    }
    sort(Q+1,Q+M+1);
    for (i=1;i<=K;++i)
    {
        reverse(Poz[i].begin(),Poz[i].end());
        if (!Poz[i].empty())
            actualizare(1,1,N,Poz[i].back(),i);
    }
    for (q=1,i=1;q<=M;++q)
    {
        for (;i<Q[q].first.first;++i)
        {
            Poz[x[i]].pop_back();
            if (!Poz[x[i]].empty())
              actualizare(1,1,N,Poz[x[i]].back(),x[i]);
        }
        raspuns[Q[q].second]=interogare(1,1,N,Q[q].first.first,Q[q].first.second);
    }
    for (q=1;q<=M;++q)
        g<<raspuns[q]<<"\n";
    return 0;
}