Cod sursa(job #39713)

Utilizator victorsbVictor Rusu victorsb Data 26 martie 2007 22:13:43
Problema Distincte Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define Nmax 100005
#define Amax 262145
#define y first
#define x second.first
#define z second.second

int n, k, m, a, b, vl;
pair<int, pair<int, int> > inv[Nmax];
int ai[Amax], prev[Nmax], sir[Nmax], p[Nmax];

void citire()
{
    int i;
    
    scanf("%d %d %d\n", &n, &k, &m);
    
    for (i = 1; i <= n; ++i)
        scanf("%d\n", &sir[i]);

    for (i = 1; i <= m; ++i)
    {
        scanf("%d %d\n", &inv[i].x, &inv[i].y);
        inv[i].z = i;
    }
}

void update(int nod, int st, int dr)
{
    if (a <= st && dr <= b)
        ai[nod] += vl;
    else
    {
        int mij = (st + dr) / 2;
        
        if (a <= mij)
            update(nod * 2, st, mij);
        
        if (mij < b)
            update(nod * 2 + 1, mij + 1, dr);
    }
}

int query(int nod, int st, int dr)
{
    if (st == dr)
        return ai[nod];
    else
    {
        int mij = (st + dr) / 2;
        
        if (a <= mij)
            return query(nod * 2, st, mij) + ai[nod];
        else
            return query(nod * 2 + 1, mij + 1, dr) + ai[nod];
    }
}

void solve()
{
    int i, ind = 0;
    
    sort(inv + 1, inv + m + 1);
    
    for (i = 1; i <= m; ++i)
    {
        while (ind < inv[i].y)
        {
            ++ind;
            
            a = prev[sir[ind]] + 1;
            b = ind;
            vl = sir[ind];
            
            update(1, 1, n);
            
            prev[sir[ind]] = ind;
        }
        
        a = inv[i].x;
        
        p[inv[i].z] = query(1, 1, n);
    }
    
    for (i = 1; i <= m; ++i)
        printf("%d\n", p[i]);
}

int main()
{
    freopen("distincte.in", "r", stdin);
    freopen("distincte.out", "w", stdout);
    citire();
    solve();
    return 0;
}