Cod sursa(job #3344775)

Utilizator RosaSofianRosa Sofian RosaSofian Data 5 martie 2026 17:05:15
Problema Distincte Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 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){
    //cout <<"Adaug: "<< l<<" "<< r<< endl;
    for(int i= l;i <= r;i++){
        if(poz[v[i]]== 0)poz[v[i]]= i, suma+= v[i];//, cout <<"+ "<< v[i]<<" ";
        else{
            if(poz[v[i]] < i)poz[v[i]]= i;
        }
    }
    //cout << endl;
}

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

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++){
        //cout << l<<" "<< r<<" si "<< inter[i].st<<" "<< inter[i].dr<< endl;
        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);
        }
        l= inter[i].st;
        r= inter[i].dr;

        rez[inter[i].poz]= suma;
        //cout << endl<< endl;
    }

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

    return 0;
}