Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define NQ 100
- #define F first
- #define S second
- #define mp make_pair
- typedef pair< pair< int, int >, int > query; // F.F = l, F.S = r, S = i
- const int N = 100;
- int sqrtn = sqrt(N);
- query queries[NQ];
- int v[N], cnt[N+1], app = 0, ans[NQ];
- bool compare(const query &a, const query &b)
- {//define qual query vem antes, por L -> R (asc)
- if( (a.F.S / sqrtn) != (b.F.S / sqrtn) )
- return (a.F.S/sqrtn) < (b.F.S/sqrtn);
- if(a.F.F!=b.F.F)
- return a.F.F < b.F.F;
- return a.S < b.S;
- }
- void f(int pos, int op) //posicao do elemento e operaçao (entrada saida)
- {
- int vertice = v[pos];
- if(op == 1)
- {
- if(cnt[vertice] == 0)
- app++;
- }
- else
- {
- if(cnt[vertice] == 1)
- app--;
- }
- cnt[vertice] += op;
- }
- int main(){
- int n, q, l, r;
- scanf("%d", &n);
- for(int i = 0; i < n; ++i)
- {
- scanf("%d", &v[i]);
- }
- scanf("%d", &q);
- for(int i = 0; i < q; ++i)
- {
- scanf("%d %d", &l, &r);
- queries[i] = mp(mp(l,r), i);
- }
- sort(queries, queries+q, compare);
- l = 1; r = 1;
- app = 0;
- memset(cnt, 0, sizeof cnt);
- f(l,1);
- for(int i = 0; i < q; ++i)
- {
- int ll = queries[i].F.F;
- int rr = queries[i].F.S;
- int pos = queries[i].S;
- while(l > ll)
- f(--l, 1);
- while(r < rr)
- f(++r, 1);
- while(l < ll)
- f(++l, -1);
- while(r > rr)
- f(--r, -1);
- ans[pos] = app;
- }
- for(int i = 0; i < q; ++i)
- cout << ans[i] << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement