Cod sursa(job #2978053)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 12 februarie 2023 20:49:44
Problema Distincte Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>

///#include <tryhardmode>
///#include <GODMODE::ON>
///#include <PRACTICE>

using namespace std;

ifstream fin ("distincte.in");
ofstream fout ("distincte.out");

const int NMAX=1e5+5;

vector<pair<int,int>>qquery[NMAX];

long long rez[NMAX];
int last[NMAX];
int v[NMAX];
long long aib[NMAX];
int n;

int lsb(int x)
{
    return x&(-x);
}

void update(int p,int val)
{
    while(p<=n)
    {
        aib[p]+=val;
        p+=lsb(p);
    }
}

long long query(int p)
{
    long long s=0;
    while(p>0)
    {
        s+=aib[p];
        p-=lsb(p);
    }
    return s;
}

long long solve_q(int st,int dr)
{
    return query(dr)-query(st-1);
}

int main()
{
    int i,j,m,k,x,y;
    fin>>n>>k>>m;
    for(i=1;i<=n;i++)
    {
        fin>>v[i];
        update(i,v[i]);
    }
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        qquery[y].push_back(make_pair(x,i));
    }
    for(i=1;i<=n;i++)
    {
        if(last[v[i]])
            update(last[v[i]],-v[i]);
        last[v[i]]=i;
        for(auto j:qquery[i])
            rez[j.second]=solve_q(j.first,i);
    }
    for(i=1;i<=m;i++)
        fout<<rez[i]<<"\n";
    return 0;
}