Cod sursa(job #3344771)

Utilizator RosaSofianRosa Sofian RosaSofian Data 5 martie 2026 16:49:21
Problema Distincte Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <fstream>
#include <algorithm>
using namespace std;

ifstream cin("distincte.in");
ofstream cout("distincte.out");

using ll= long long;
const int dim= 1e5+ 5;
int v[dim], poz[dim];

struct ura{
    int st, dr, poz;
}inter[dim];
ll rez[dim];

bool cmp(ura a, ura b){
    return ((a.dr < b.dr) or (a.dr== b.dr and a.st < b.st));
}

ll suma= 0;

void adauga(int l, int r){
    for(int i= l;i <= r;i++){
        if(poz[v[i]]== 0)poz[v[i]]= i, suma+= v[i];
        else{
            if(poz[v[i]] < i)poz[v[i]]= i;
        }
    }
}

void sterge(int l, int r){
    for(int i= l;i <= r;i++){
        if(poz[v[i]]== i){
            suma-= v[i];
            poz[v[i]]= 0;
        }
    }
}

int main()
{
    int n, k, m, i, j, l, r;
    cin >> n>> k>> m;

    for(i= 1;i <= n;i++){
        cin >> v[i];
    }

    for(i= 1;i <= m;i++){
        cin >> inter[i].st>> inter[i].dr;
        inter[i].poz= i;
    }

    sort(inter+ 1, inter+ 1+ m, cmp);

    l= r= 0;
    for(i= 1;i <= m;i++){
        if(r < inter[i].st){
            sterge(l, r);
            adauga(inter[i].st, inter[i].dr);
        }
        else
        if(l < inter[i].st){
            sterge(l, inter[i].st- 1);
            adauga(r+ 1, inter[i].dr);
        }
        else{
            adauga(inter[i].st, l- 1);
            adauga(r+ 1, inter[i].dr);
        }

        rez[inter[i].poz]= suma;
    }

    for(i= 1;i <= m;i++)
        cout << rez[i]<< '\n';

    return 0;
}