Cod sursa(job #2461414)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 25 septembrie 2019 17:29:32
Problema Distincte Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <bits/stdc++.h>

FILE *in = fopen("distincte.in", "r"), *out = fopen("distincte.out", "w") ;

const int MV = 1e5 ;
const int MOD = 666013 ;

int n, k, m ;

typedef std::pair<int, int> PII ;

std::vector<PII> offline[MV + 5] ; /// rezolvam querry-urile offline dupa capat dreapta
int v[MV + 5] ;
int prev[MV + 5] ;
int aib[MV + 5] ;
int ans[MV + 5] ;

void update(int poz, int val) {
        for (int i = poz ; i <= n ; i += (i & -i)) {
                aib[i] += val ;
        }
}

int querry(int poz) {
        int ret(0) ;
        for (int i = poz ; i > 0 ; i -= (i & -i)) {
                ret += aib[i] ;
        }
        return ret ;
}

int main() {
        fscanf(in, "%d %d %d", &n, &k, &m) ;
        for (int i = 1 ; i <= n ; ++ i) {
                fscanf(in, "%d", v + i) ;
        }
        int left, right ;
        for (int i = 1 ; i <= m ; ++ i) {
                fscanf(in, "%d %d", &left, &right) ;
                offline[right].push_back({left, i}) ; /// binecuvantat fie chiriac ca mi-a zis ca pot sa fac offline
        }
        for (int i = 1 ; i <= n ; ++ i) {
                if (prev[v[i]] != 0) {
                        /// update(prev[v[i]], -1) ;  :((((((   suma ne cere nu cate :((
                        update(prev[v[i]], -v[i]) ;
                }
                prev[v[i]] = i ;
                /// update(i, 1) ; la fel
                update(i, v[i]) ;
                for (auto it : offline[i]) {
                        ans[it.second] = (querry(i) - querry(it.second - 1)) % MOD ;
                }
        }
        for (int i = 1 ; i <= m ; ++ i) {
                fprintf(out, "%d\n", ans[i]) ;
        }
}