Link to this code:
https://cses.fi/paste/5fe0dc7cc8f10b157cb1b6/#include<bits/stdc++.h>
using namespace std;
int n,m,cnt;
char c1,c2;
vector<int> graph[1<<18],hparg[1<<18],topo,scc(1<<18);
bitset<(1<<18)> vis,ans;
void dfs(int now){
vis[now]=1;
for(const int& i:graph[now])if(!vis[i])dfs(i);
topo.emplace_back(now);
}
inline void sfd(int now){
scc[now]=cnt;
for(const int& i:hparg[now])if(!scc[i])sfd(i);
}
int main(){
cin.tie(nullptr)->sync_with_stdio(0),cout.tie(0);
cin>>n>>m;
for(int i = 0,a,b;i<n;i++){
cin>>c1>>a>>c2>>b;
if (c1=='-')a=2*m-a+1;
if (c2=='-')b=2*m-b+1;
graph[2*m-a+1].emplace_back(b), graph[2*m-b+1].emplace_back(a);
hparg[a].emplace_back(2*m-b+1), hparg[b].emplace_back(2*m-a+1);
}
for(int i = 1;i<=2*m;i++)if(!vis[i])dfs(i);
for(auto it=topo.rbegin();it!=topo.rend();it++)if(!scc[*it])++cnt,sfd(*it);
for(int i = 1;i<=m;i++){
if(scc[i]==scc[2*m-i+1])return cout<<"IMPOSSIBLE",0;
ans[i]=(scc[i]>scc[2*m-i+1]);
}
for(int i = 1;i<=m;i++)cout<<(ans[i]?"+ ":"- ");
}