Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cstring>
- #include <map>
- #define INFL "in"
- #define OUTFL "out"
- using namespace std;
- #define NMax 100010
- int n, m;
- int v[NMax];
- int next[NMax];
- map<int, int> nextup;
- int H[NMax], hdim;
- map<int, int> pos;
- void downheap(int u) {
- while(u <= hdim) {
- int v = (u<<1);
- if(v > hdim) return;
- if( v+1<=hdim && nextup[H[v+1]] > nextup[H[v]] ) ++v;
- if(nextup[H[u]] < nextup[H[v]]) {
- int aux = pos[H[u]];
- pos[H[u]] = pos[H[v]];
- pos[H[v]] = aux;
- swap(H[v], H[u]);
- u = v;
- }
- else return;
- }
- }
- void upheap(int u) {
- while(u > 1) {
- int v = (u>>1);
- if(nextup[H[u]] > nextup[H[v]]) {
- int aux = pos[H[u]];
- pos[H[u]] = pos[H[v]];
- pos[H[v]] = aux;
- swap(H[u], H[v]);
- u = v;
- }
- else return;
- }
- }
- void solve() {
- scanf("%d%d", &n, &m);
- while(true) {
- for (int i = 1; i <= n; ++i) scanf("%d", &v[i]);
- //calculez next
- for(int i=n; i>=1; --i) {
- if(nextup.find(v[i]) == nextup.end()) nextup[v[i]] = n+1;
- next[i] = nextup[v[i]];
- nextup[v[i]] = i;
- }
- //adaug primele m elemente in heap
- for(int i=1; i<=m; ++i) {
- pos[i] = ++hdim;
- H[hdim] = i;
- upheap(hdim);
- }
- int ans = 0;
- for(int i=1; i<=n; ++i) {
- if(pos.find(v[i]) != pos.end()) { //e in heap
- nextup[v[i]] = next[i];
- upheap(pos[v[i]]);
- }
- else { //scot primul din heap si il adaug pe acesta
- pos.erase(pos.find(H[1]));
- H[1] = H[hdim--];
- pos[H[1]] = 1;
- downheap(1);
- ans++;
- H[++hdim] = v[i];
- nextup[v[i]] = next[i];
- pos[v[i]] = hdim;
- upheap(hdim);
- }
- }
- nextup.clear();
- pos.clear();
- hdim = 0;
- memset(v, 0, sizeof(v));
- memset(H, 0, sizeof(H));
- memset(next, 0, sizeof(next));
- if(scanf("%d%d", &n, &m) != 2) {
- printf("%d", ans);
- return;
- }
- printf("%d\n", ans);
- }
- }
- int main() {
- #define ONLINE_JUDGE 1
- #ifndef ONLINE_JUDGE
- freopen(INFL, "r", stdin);
- freopen(OUTFL, "w", stdout);
- #endif
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement