[TASK]:
You will be given lines of pseudocode, your task is to write the corresponding C++ code. The pseudocode will provide detailed description of the c++ code line by line. The pseudocode is garanteed to be correct and complete.

[INSTRUCTION]:
The following libraries are already included in the code.
```cpp
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <cmath>
#include <cstring>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <fstream>
#include <climits>
#include <cassert>
#include <iomanip>
#include <sstream>
#include <bitset>
using namespace std;
```
Do not include them in your code again. Please surround your code with ```cpp and ``` markers. Note that the code should correspond to the pseudocode line by line.

[PSEUDOCODE]:
maxn = const int with maxn = 105
num = integer array of size maxn
define the main function
    s = string
    read s
    n = integer
    l = integer with l = s.size()
    set all contents of num to 0
    zheng, fu = integer with zheng = 0, fu = 0
    zuida = int with zuida = 1
    pos = integer
    num[1] = 1
    increment zheng
    increment zuida
    for i = 1 to l
        if s[i] is +
            num[increment zuida] = 1
            increment zheng
        else if s[i] is -
            num[increment zuida] = -1
            increment fu
        else if s[i] is =
            pos = i
            break loop
        end of the block
    end of the block
    a = string with a = s.substr(pos + 2)
    ss = stringstream, call ss on a
    right shift ss n times
    flag = bool with flag = false
    for i = 1 to zuida exclusive
        if n is zheng - fu)
            flag = true
            break loop
        end of the block
        while n > zheng - fu and num[i] > 0 and num[i] < n
            increment zheng
            increment num[i]
        end of the block
        while (n < zheng - fu and num[i] < 0 and abs(num[i]) < n)
            increment fu
            decrement num[i]
        end of the block
    end of the block
    if n is zheng - fu, flag = true
    if flag
        print Possible
        print num[1]
        for i = 2 to zuida exclusive
            if num[i] < 0
                print - and -num[i]
            else
                print + and num[i]
        end of the block
        print =
        print n
    else
        print Impossible
    return to indicate successful execution
end of the block

[CODE]:

const int maxn = 105;
int num[maxn];
int main() {
    string s;
    getline(cin, s);
    int n;
    int l = s.size();
    memset(num, 0, sizeof(num));
    int zheng = 0, fu = 0;
    int zuida = 1;
    int pos;
    num[1] = 1;
    ++zheng;
    ++zuida;
    for (int i = 1; i < l; i++) {
        if (s[i] == '+') {
            num[zuida++] = 1;
            ++zheng;
        } else if (s[i] == '-') {
            num[zuida++] = -1;
            ++fu;
        } else if (s[i] == '=') {
            pos = i;
            break;
        }
    }
    string a = s.substr(pos + 2);
    stringstream ss(a);
    ss >> n;
    bool flag = false;
    for (int i = 1; i < zuida; i++) {
        if (n == zheng - fu) {
            flag = true;
            break;
        }
        while (n > zheng - fu && num[i] > 0 && num[i] < n) {
            ++zheng;
            ++num[i];
        }
        while (n < zheng - fu && num[i] < 0 && abs(num[i]) < n) {
            ++fu;
            --num[i];
        }
    }
    if (n == zheng - fu) flag = true;
    if (flag) {
        cout << "Possible" << endl;
        cout << num[1];
        for (int i = 2; i < zuida; i++) {
            if (num[i] < 0)
                cout << " - " << -num[i];
            else
                cout << " + " << num[i];
        }
        cout << " = ";
        cout << n << endl;
    } else
        cout << "Impossible" << endl;
    return 0;
}