Cod sursa(job #480133)

Utilizator andra23Laura Draghici andra23 Data 26 august 2010 15:07:54
Problema Secventa 5 Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include<iostream>
#include<fstream>
#include<vector>
#define r 699957

using namespace std;

struct elem {
    unsigned int inf, ap;
    elem(unsigned int a, unsigned int b){
        inf = a;
        ap = b;
    }
};

vector <elem> h1[r+10], h2[r+10];
unsigned int a[1100000];
int l, u;

void add(vector <elem> h[], unsigned int x, int &nr){
        int poz = x%r;
        int cod = 1;
        for (int i = 0; i < h[poz].size(); i++)
            if (h[poz][i].inf == x){
                h[poz][i].ap++;
                cod = 0;
                break;
            }
        if (cod == 1){
            nr++;
            h[poz].push_back(elem(x, 1));
        }
}

void decrease(vector <elem> h[], int &nr, int &p, int n, int t){
    int cod = 1, poz;
        while (cod == 1){
            poz = a[p]%r;
            for (int i = 0; i < h[poz].size(); i++)
                if (h[poz][i].inf == a[p]){
                    if (h[poz][i].ap > 1){
                        h[poz][i].ap--;
                        p++;
                    }
                    else {
                        if (t == 1 && nr-1 < n)
                            cod = 0;
                        else {
                            nr--;
                            h[poz][i] = h[poz][h[poz].size()-1];
                            h[poz].pop_back();
                            p++;
                            if (t==0 && nr==n)
                                cod = 0;
                        }    
                    } 
                break;       
                }    
        }
}

int main(){
    freopen("secv5.in", "r", stdin);
    ofstream g("secv5.out");
    int n, i = 0, j = 0, nr1 = 0, nr2 = 0, k = 1, p1, p2;
    long long nr = 0;
    char s[12];
    scanf("%d %d %d", &n, &l, &u);
    fgets(s, 12, stdin);
    while (k <= n && nr1 < l){
        fgets(s, 12, stdin);
        a[k] = strtoul (s,NULL,0);
        add(h1, a[k], nr1);
        add(h2, a[k], nr2);
        k++;
    }   
    
    nr2 = nr1;     
    p1 = p2 = 1;
    decrease(h2, nr2, p2, l, 1);
    nr = p2-p1+1;

    for (j = k; j <= n; j++){
        fgets(s, 12, stdin);
        a[j] = strtoul (s,NULL,0);
        add(h1, a[j], nr1);
        add(h2, a[j], nr2);
        if (nr1 > u)
            decrease(h1, nr1, p1, u, 0);
        decrease(h2, nr2, p2, l, 1);
        nr = nr+p2-p1+1;
    }
    
    g<<nr<<'\n';
    
    return 0;
}