Pagini recente » Cod sursa (job #1918479) | Cod sursa (job #1670115) | Cod sursa (job #2107236) | Cod sursa (job #2962111) | Cod sursa (job #1048921)
#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] ;
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, int ok)
{
if( st == dr )
{
if( urm[st] > ok )
aint[nod] = v[st] ;
return ;
}
int fiust = 2 * nod ;
int fiudr = 2 * nod + 1 ;
int mij = ( st + dr ) >> 1 ;
arbore( fiust, st, mij, ok ) ;
arbore( fiudr, mij + 1, dr, ok ) ;
aint[nod] = aint[fiust] + aint[fiudr] ;
}
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 <= M; ++i )
{
cin >> q[i].s >> q[i].e ;
q[i].ind = i ;
}
sort( q + 1, q + M + 1, cmp ) ;
arbore( 1, q[1].s, q[1].e, q[1].e ) ;
sol[ q[1].ind ] = aint[1] ;
for(int i = 2; i <= M; ++i )
{
sol[ q[i].ind ] = sol[ q[i - 1].ind ] ;
for(int j = q[i - 1].e; j > q[i].e; --j )
if( in[j] < q[i].s || in[j] > q[i].e )
sol[ q[i].ind ] -= v[j] ;
if( q[i].s < q[i - 1].s )
for(int j = q[i].s; j <= q[i - 1].s; ++j )
if( urm[j] > q[i].e )
sol[ q[i].ind ] += v[j] ;
}
for(int i = 1; i <= M; ++i )
cout << sol[i] << "\n" ;
return 0 ;
}