Cod sursa(job #1293006)

Utilizator bulbulicaAlexandrescu Cristian bulbulica Data 15 decembrie 2014 09:44:03
Problema Distincte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#define Nmax 400200
using namespace std;
ifstream f("distincte.in");
ofstream g("distincte.out");

int vector[Nmax],n,m,k,x[Nmax];

void actualizare(int nod,int st, int dr,int val,int poz)
{
    if (st==dr)
    {
        vector[nod]=val;
        return;
    }
    int mij=(st+dr)/2;
    if (poz<=mij)
        actualizare(2*nod,st,mij,val,poz);
    else
        actualizare(2*nod+1,mij+1,dr,val,poz);
    vector[nod]=vector[2*nod]+vector[2*nod+1];
}
void interogare(int nod,int st,int dr,int inceput,int final,long long &max)
{
    if (inceput<=st && final>=dr && st==dr)
    {
        if(x[vector[nod]]!=0)
        {
            max+=vector[nod];
            max%=666013;
            x[vector[nod]]=0;
        }
        return;
    }
    int mij =(st+dr)/2;
    if (inceput<=mij)
        interogare(2*nod,st,mij,inceput,final,max);
    if (mij<final)
        interogare(2*nod+1,mij+1,dr,inceput,final,max);
}
void creare(int n)
{
    for (int i=1;i<=n;++i)
        x[i]=i;
}
int main()
{
    int nr,val1,val2,suma,pozitie,valoare;
    f>>n>>k>>m;
    for (int i=1;i<=n;++i)
    {
        f>>nr;
        pozitie=i;
        valoare=nr;
        actualizare(1,1,n,valoare,pozitie);
    }
    for (int i=1;i<=m;++i)
    {
        f>>val1>>val2;;
        long long suma=0;
        creare(k);
        interogare(1,1,n,val1,val2,suma);
        g<<suma<<'\n';
    }
    return 0;
}