Cod sursa(job #1048957)

Utilizator matei_cChristescu Matei matei_c Data 6 decembrie 2013 17:40:25
Problema Distincte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std ;

#define maxn 100001

struct qq
{
    int s, e, ind ;
};

int N, K, M ;

int v[maxn], w[maxn] ;

qq q[maxn] ;

int sol[maxn] ;

int urm[maxn], in[maxn] ;
int poz[maxn] ;

int aint[2 * maxn] ;

bool cmp(qq A, qq B)
{
    if( A.e < B.e )
        return false ;

    if( A.e > B.e )
        return true ;

    if( A.e == B.e && A.s > B.s )
        return true ;

    return false ;
}

void arbore(int nod, int st, int dr)
{
    if( st == dr )
    {
        aint[nod] = w[st] ;
        return ;
    }

    int fiust = 2 * nod ;
    int fiudr = 2 * nod + 1 ;
    int mij = ( st + dr ) >> 1 ;

    arbore( fiust, st, mij) ;
    arbore( fiudr, mij + 1, dr) ;

    aint[nod] = aint[fiust] + aint[fiudr] ;
}

int query(int nod, int st, int dr)
{
    if( st == dr )
        return w[st] ;

    int fiust = 2 * nod ;
    int fiudr = 2 * nod + 1 ;
    int mij = ( st + dr ) >> 1 ;

    return query( fiust, st, mij ) + query( fiudr, mij + 1, dr ) ;
}

int main()
{
    freopen("distincte.in", "r", stdin);
    freopen("distincte.out", "w", stdout);

    cin >> N >> K >> M ;

    for(int i = 1; i <= N; ++i )
        urm[i] = N + 2 ;

    for(int i = 1; i <= N; ++i )
    {
        cin >> v[i] ;

        if( poz[ v[i] ] )
            urm[ poz[ v[i] ] ] = i, in[i] = poz[ v[i] ] ;

        poz[ v[i] ] = i ;
    }

    for(int i = 1; i <= N; ++i )
        if( urm[i] == N + 2 )
            w[i] = v[i] ;

    for(int i = 1; i <= M; ++i )
    {
        cin >> q[i].s >> q[i].e ;
        q[i].ind = i ;
    }

    //sort( q + 1, q + M + 1, cmp ) ;

    for(int i = 1; i <= N; ++i )
        if( urm[i] > q[1].e )
            w[i] = v[i] ;

    //arbore( 1, 1, N ) ;

    sol[ q[1].ind ] = query( 1, q[1].s, q[1].e ) ;
    return 0 ;
    for(int i = 2; i <= M; ++i )
    {
        if( q[i].e == q[i - 1].e )
            sol[ q[i].ind ] = query( 1, q[i].s, q[i].e ) ;
        else
        {
            for(int j = q[i - 1].e; j > q[i].e; --j )
                w[ in[j] ] = v[ in[j] ] ;

            arbore( 1, 1, N ) ;
            sol[ q[i].ind ] = query( 1, q[i].s, q[i].e ) ;
        }
    }

    for(int i = 1; i <= M; ++i )
        cout << sol[i] << "\n" ;

    return 0 ;
}