D. Persistent Bookcase
time limit per test

2 seconds

memory limit per test

512 megabytes

input

standard input

output

standard output

Recently in school Alina has learned what are the persistent data structures: they are data structures that always preserves the previous version of itself and access to it when it is modified.

After reaching home Alina decided to invent her own persistent data structure. Inventing didn't take long: there is a bookcase right behind her bed. Alina thinks that the bookcase is a good choice for a persistent data structure. Initially the bookcase is empty, thus there is no book at any position at any shelf.

The bookcase consists of n shelves, and each shelf has exactly m positions for books at it. Alina enumerates shelves by integers from 1to n and positions at shelves — from 1 to m. Initially the bookcase is empty, thus there is no book at any position at any shelf in it.

Alina wrote down q operations, which will be consecutively applied to the bookcase. Each of the operations has one of four types:

  • i j — Place a book at position j at shelf i if there is no book at it.
  • i j — Remove the book from position j at shelf i if there is a book at it.
  • i — Invert book placing at shelf i. This means that from every position at shelf i which has a book at it, the book should be removed, and at every position at shelf i which has not book at it, a book should be placed.
  • k — Return the books in the bookcase in a state they were after applying k-th operation. In particular, k = 0 means that the bookcase should be in initial state, thus every book in the bookcase should be removed from its position.

After applying each of operation Alina is interested in the number of books in the bookcase. Alina got 'A' in the school and had no problem finding this values. Will you do so?

Input

The first line of the input contains three integers nm and q (1 ≤ n, m ≤ 103, 1 ≤ q ≤ 105) — the bookcase dimensions and the number of operations respectively.

The next q lines describes operations in chronological order — i-th of them describes i-th operation in one of the four formats described in the statement.

It is guaranteed that shelf indices and position indices are correct, and in each of fourth-type operation the number k corresponds to some operation before it or equals to 0.

Output

For each operation, print the number of books in the bookcase after applying it in a separate line. The answers should be printed in chronological order.

Examples
input
2 3 3
1 1 1
3 2
4 0
output
1
4
0
input
4 2 6
3 2
2 2 2
3 3
3 2
2 2 2
3 2
output
2
1
3
3
2
4
input
2 2 2
3 2
2 2 1
output
2
1
Note

This image illustrates the second sample case.

思路:dfs+bitset;

每个状态都是由前面的状态而得到的,但当4操作的时候,这个时候这个状态就是k那个状态,所以本状态可以看成是有k状态得来,所以我们可以建图,确定当前状态的前一个状态

,然后dfs就行了,并且用bitset记录状态。

  1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<queue>
6 #include<set>
7 #include<bitset>
8 using namespace std;
9 typedef struct node
10 {
11 int val;
12 int x;
13 int y;
14 } ss;
15 ss ak[100005];
16 bitset<1005>bit[1005],c;
17 vector<int>vec[100005];
18 int ask[100005];
19 bool T[100005];
20 int all;
21 void ou(int s);
22 void dfs(int s);
23 void in(int s);
24 int main(void)
25 {
26 int i,j;
27 int n,m,k;
28 while(scanf("%d %d %d",&n,&m,&k)!=EOF)
29 {
30 all = 0;
31 memset(T,0,sizeof(T));
32 for(i = 1; i <= m ; i++)
33 {
34 bit[i].reset();
35 c.set(i);
36 }
37 for(i = 0; i < 10005; i++)
38 vec[i].clear();
39 for(i = 1; i <= k; i++)
40 {
41 scanf("%d",&ak[i].val);
42 if(ak[i].val<= 2)
43 {
44 scanf("%d %d",&ak[i].x,&ak[i].y);
45 vec[i-1].push_back(i);
46 }
47 else
48 {
49 scanf("%d",&ak[i].x);
50 if(ak[i].val == 3)
51 {
52 vec[i-1].push_back(i);
53 }
54 else vec[ak[i].x].push_back(i);
55 }
56 }
57 dfs(0);
58 for(i = 1; i <=k ; i++)
59 printf("%d\n",ask[i]);
60 }
61 return 0;
62 }
63 void dfs(int s)
64 {
65 int i,j;
66 for(i = 0; i < vec[s].size() ; i++)
67 {in(vec[s][i]);dfs(vec[s][i]);ou(vec[s][i]);}
68 }
69 void in(int s)
70 {
71 if(ak[s].val == 1)
72 {
73 if(!bit[ak[s].x][ak[s].y])
74 {
75 T[s] = true;
76 bit[ak[s].x].set(ak[s].y);
77 ask[s] = all+1;
78 all++;
79 }
80 else ask[s] = all;
81 }
82 else if(ak[s].val == 2)
83 {
84 if(bit[ak[s].x][ak[s].y])
85 {
86 T[s] = true;
87 bit[ak[s].x].reset(ak[s].y);
88 ask[s] = all-1;
89 all--;
90 }
91 else ask[s] = all;
92 }
93 else if(ak[s].val == 3)
94 {
95 all -=bit[ak[s].x].count();
96 bit[ak[s].x] ^= c;
97 all += bit[ak[s].x].count();
98 ask[s] = all;
99
100 }
101 else ask[s] = all;
102 }
103 void ou(int s)
104 {
105 if(ak[s].val == 1)
106 {
107 if(T[s])
108 {
109 all --;
110 bit[ak[s].x].reset(ak[s].y);
111 }
112 }
113 else if(ak[s].val == 2)
114 {
115 if(T[s])
116 {
117 all++;
118 bit[ak[s].x].set(ak[s].y);
119 }
120 }
121 else if(ak[s].val == 3)
122 {
123 all -=bit[ak[s].x].count();
124 bit[ak[s].x] ^= c;
125 all += bit[ak[s].x].count();
126 }
127 }

D. Persistent Bookcase(Codeforces Round #368 (Div. 2))的更多相关文章

  1. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  2. Codeforces Round #368 (Div. 2) C. Pythagorean Triples(数学)

    Pythagorean Triples 题目链接: http://codeforces.com/contest/707/problem/C Description Katya studies in a ...

  3. Codeforces Round #368 (Div. 2) B. Bakery (模拟)

    Bakery 题目链接: http://codeforces.com/contest/707/problem/B Description Masha wants to open her own bak ...

  4. Codeforces Round #368 (Div. 2) A. Brain's Photos (水题)

    Brain's Photos 题目链接: http://codeforces.com/contest/707/problem/A Description Small, but very brave, ...

  5. Codeforces Round #368 (Div. 2) D. Persistent Bookcase

    Persistent Bookcase Problem Description: Recently in school Alina has learned what are the persisten ...

  6. Codeforces Round #368 (Div. 2) D. Persistent Bookcase 离线 暴力

    D. Persistent Bookcase 题目连接: http://www.codeforces.com/contest/707/problem/D Description Recently in ...

  7. Codeforces Round #368 (Div. 2)D. Persistent Bookcase DFS

    题目链接:http://codeforces.com/contest/707/my 看了这位大神的详细分析,一下子明白了.链接:http://blog.csdn.net/queuelovestack/ ...

  8. Codeforces Round #368 (Div. 2) E. Garlands 二维树状数组 暴力

    E. Garlands 题目连接: http://www.codeforces.com/contest/707/problem/E Description Like all children, Ale ...

  9. Codeforces Round #368 (Div. 2) C. Pythagorean Triples 数学

    C. Pythagorean Triples 题目连接: http://www.codeforces.com/contest/707/problem/C Description Katya studi ...

随机推荐

  1. ubuntu 常用指令

    1.进入到root权限的指令 sudo su,效果同su,只是不需要root的密码,而需要当前用户的密码.(亲测有效) 2.从root权限里面退出到 普通用户模式 exit---指令亲测有效 3.下载 ...

  2. 【Redis】过期键删除策略和内存淘汰策略

    Redis 过期键策略和内存淘汰策略 目录 Redis 过期键策略和内存淘汰策略 设置Redis键过期时间 Redis过期时间的判定 过期键删除策略 定时删除 惰性删除 定期删除 Redis过期删除策 ...

  3. LeetCode两数之和

    LeetCode 两数之和 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是 ...

  4. Hbase(二)【shell操作】

    目录 一.基础操作 1.进入shell命令行 2.帮助查看命令 二.命名空间操作 1.创建namespace 2.查看namespace 3.删除命名空间 三.表操作 1.查看所有表 2.创建表 3. ...

  5. 01 nodejs MVC gulp 项目搭建

    文本内容 使用generator-express创建nodejs MVC DEMO 使用gulp实时编译项目 npm安装二进制包,无须再编译wget https://nodejs.org/dist/v ...

  6. File类及常用操作方法

    import java.io.File; import java.io.IOException; public class file { public static void main(String[ ...

  7. 实现nfs持久挂载+autofs自动挂载

    实验环境: 两台主机 node4:192.168.37.44 NFS服务器 node2:192.168.37.22 客户端 在nfs服务器,先安装nfs和rpcbind [root@node4 fen ...

  8. 【C/C++】链表/ListNode/数据结构

    vector的操作 添加元素: 向尾部添加一个元素 vector<int> a; a.push_back(1); 向尾部添加多个元素 -向尾部添加x个同样的元素: a.insert(a.e ...

  9. python数据预处理和特性选择后列的映射

    我们在用python进行机器学习建模时,首先需要对数据进行预处理然后进行特征工程,在这些过程中,数据的格式可能会发生变化,前几天我遇到过的问题就是: 对数据进行标准化.归一化.方差过滤的时候数据都从D ...

  10. Python循环控制

    一.比较符 和算术操作符一样,布尔操作符也有操作顺序.在所有算术和比较操作符求值后,Python 先求值 not 操作符,然后是 and 操作符,然后是 or 操作符. 二.if控制 if name ...