Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #include <unordered_map>
- #define maxn 11
- #define smaxn 400
- #define F first
- #define S second
- #define mp make_pair
- using namespace std;
- struct Block {
- int ini, fim, qtd;
- Block() {
- ini = fim = -1;
- qtd = 0;
- }
- };
- int bs;
- Block sum[smaxn];
- int v[maxn];
- unordered_map<int,pair<int,pair<int,int> > > pos;
- int n;
- int query(int l,int r) {
- //printf("Q %d %d\n",l,r );
- int ans = 0;
- while(l!=sum[pos[l].F].ini && l!=r ){
- ans++;
- l = pos[l].S.S;
- }
- while(pos[l].F < pos[r].F){
- ans+=bs;
- l = sum[pos[l].F+1].ini;
- }
- while(l!=r){
- ans++;
- l = pos[l].S.S;
- }
- return ans+1;
- }
- int insert(int p, int e) {
- int bloco = pos[p].F;
- if(sum[bloco].fim == p){
- bloco++;
- }
- int prox = pos[p].S.S;
- pos[prox].S.F = e;
- pos[p].S.S = e;
- pos[e].F = bloco;
- pos[e].S.F = p;
- pos[e].S.S = prox;
- while(sum[bloco].qtd ==bs){
- int ult = sum[bloco].fim;
- sum[bloco+1].ini = sum[bloco].fim;
- sum[bloco].fim = pos[ult].S.F;
- pos[ult].F++;
- bloco++;
- }
- int ult = sum[bloco].fim;
- sum[bloco+1].ini = sum[bloco].fim;
- sum[bloco].fim = pos[ult].S.F;
- sum[bloco].qtd++;
- }
- int remove(int p) {
- int bloco = pos[p].F;
- pos[pos[p].S.F].S.S =pos[p].S.S;
- pos[pos[p].S.S].S.F =pos[p].S.F;
- bloco++;
- while(sum[bloco].qtd ==bs){
- int prim = sum[bloco].ini;
- sum[bloco-1].fim = sum[bloco].ini;
- sum[bloco].ini = pos[prim].S.S;
- pos[prim].F--;
- bloco++;
- }
- int prim = sum[bloco].ini;
- sum[bloco-1].fim = sum[bloco].ini;
- sum[bloco].ini = pos[prim].S.S;
- sum[bloco].qtd--;
- }
- void build () {
- int k=0;
- pos[-1] = mp(-1,mp(-1,-1));
- for(int i=0;i<bs;i++){
- int ac=0;
- sum[i].ini = v[k];
- for(int j=0;j<bs;j++){
- pos[v[k]].F = i;
- pos[v[k]].S.F = !k?-1:v[k-1];
- pos[v[k]].S.S = v[k+1];
- printf("%d %d %d %d %d\n",k,v[k],pos[v[k]].F,pos[v[k]].S.F,pos[v[k]].S.S );
- ac++;
- k++;
- if (v[k] == -1) break;
- }
- sum[i].fim = v[k-1];
- sum[i].qtd = ac;
- if (v[k] == -1) break;
- }
- }
- void printlist(){
- int i = sum[0].ini;
- printf("--%d\n",i);
- while(i!=-1 && i){
- printf("%d\n",i );
- i = pos[i].S.S;
- }
- printf("--\n");
- }
- int main () {
- scanf("%d", &n);
- bs =sqrt(maxn);
- memset(v, -1, sizeof v);
- for (int i = 0; i < n; i++) {
- scanf("%d", v+i);
- }
- build();
- /*for(int i=0;i<2;i++){
- printf("%d %d\n",sum[i].ini,sum[i].fim);
- }
- printf("\n");*/
- int q; scanf("%d", &q);
- while(q--) {
- printlist();
- char c; scanf(" %c", &c);
- if (c == 'I') {
- int p, e; scanf("%d %d", &p, &e);
- insert(e,p);
- } else if (c == 'R') {
- int e; scanf("%d", &e);
- remove(e);
- } else {
- int a, b; scanf("%d %d", &a, &b);
- printf("%d\n",query(pos[a].S.S,pos[b].S.F) );
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement