class WorkingMemory:
    def __init__(self):
        self.memory = {}
        self.sense_tags = {}

    def add_entry(self, key, value, tags=None):
        """Add an entry with a specific key-value pair."""
        if tags is None:
            tags = []
        self.memory[key] = value
        for tag in tags:
            self.add_tag(tag, key)
        
    def add_tag(self, tag, key):
        """Add or update a tag associated with the memory key."""
        if tag not in self.sense_tags:
            self.sense_tags[tag] = [key]
        else:
            if key not in self.sense_tags[tag]:
                self.sense_tags[tag].append(key)

    def retrieve_by_tag(self, tag):
        """Retrieve all entries associated with a specific tag."""
        return [self.memory[key] for key in self.sense_tags.get(tag, [])]

    def update_entry(self, key, new_value):
        """Update the value of an existing entry by its key."""
        if key in self.memory:
            self.memory[key] = new_value
            # Remove outdated tags
            for tag in self.sense_tags.keys():
                if key in self.sense_tags[tag]:
                    self.sense_tags[tag].remove(key)
        
    def remove_entry(self, key):
        """Remove an entry by its key."""
        if key in self.memory:
            del self.memory[key]
            # Remove outdated tags
            for tag in self.sense_tags.keys():
                if key in self.sense_tags[tag]:
                    self.sense_tags[tag].remove(key)
    
    def display_memory(self):
        """Display the current state of memory."""
        return self.memory

    def display_tags(self):
        """Display all the tags and their associated keys."""
        return {tag: value for tag, value in self.sense_tags.items()}