Pagini recente » Cod sursa (job #2750311) | Cod sursa (job #870527) | Cod sursa (job #1995411) | Cod sursa (job #384221) | Cod sursa (job #1048957)
#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 ;
}