Cod sursa(job #2977629)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 12 februarie 2023 00:51:53
Problema Distincte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <map>
#include <cmath>

///#include <tryhardmode>
///#include <GODMODE::ON>
///DAU PENTRU TITANS RO017

using namespace std;

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

const int NMAX=1e5+5;
const int MOD=666013;

int v[NMAX];
int frecv[NMAX];

int block;
int rez[NMAX];

struct elem{
    int st;
    int dr;
    int ind;
}query[NMAX];

bool cmp(elem a,elem b)
{
    if(a.st/block!=b.st/block)
        return a.st/block<b.st/block;
    return a.dr<b.dr;
}

void solve_q(int q)
{
    int i,st=1,dr=0;
    unsigned long long total=0;
    for(i=1;i<=q;i++)
    {
        while(dr<query[i].dr)
        {
            frecv[v[dr+1]]++;
            if(frecv[v[dr+1]]==1)
                total=total+v[dr+1];
            dr++;
        }
        while(dr>query[i].dr)
        {
            frecv[v[dr]]--;
            if(frecv[v[dr]]==0)
                total-=v[dr];
            dr--;
        }
        while(st<query[i].st)
        {
            frecv[v[st]]--;
            if(frecv[v[st]]==0)
                total-=v[st];
            st++;
        }
        while(st>query[i].st)
        {
            frecv[v[st-1]]++;
            if(frecv[v[st-1]]==1)
                total=total+v[st-1];
            st--;
        }
        rez[query[i].ind]=total%MOD;
    }
}

int main()
{
    int n,m,i,j,k;
    fin>>n>>k>>m;
    block=(int)sqrt(n);
    for(i=1;i<=n;i++)
        fin>>v[i];
    for(i=1;i<=m;i++)
    {
        fin>>query[i].st;
        fin>>query[i].dr;
        query[i].ind=i;
    }
    sort(query+1,query+m+1,cmp);
    solve_q(m);
    for(i=1;i<=m;i++)
        fout<<rez[i]<<"\n";
    return 0;
}