Problem:
品質検査
問題
あなたはある機械の製造工場で品質管理の責任者をしている． この機械には， 部品として電源とモーターとケーブルが必要である． 製造工場には電源が a 個， モーターが b 個， ケーブルが c 個あり， それぞれ 1 から a まで， a+1 から a+b まで， a+b+1 から a+b+c までの番号が付いている． 困ったことに， 部品の中に故障しているものがあるかもしれない． 工場ではどの部品が故障していてどの部品が正常であるかを知りたい．
そこで， 工場では次の方法で部品を検査した． 電源とモーターとケーブルを１つずつ持ってきてつなぎ， 動作させてみる． このとき， ３つの部品がすべて正常であるときは正しく動作して「合格」とわかる． ３つの中に故障している部品が１つでも入っているときは正しく動作しないので「不合格」とわかる． （工場で作っている機械はとても精密なので， 故障した部品がまざっているのに偶然正しく動作してしまうなどということは起きないのだ．）
あなたには検査結果のリストが渡される． 検査結果のリストの各行には， 検査に使った電源とモーターとケーブルの番号と， 検査が合格だったか不合格だったかが書かれている．
検査結果のリストが与えられたとき， すべての部品を， 検査結果から確実に故障しているとわかる部品と， 確実に正常とわかる部品と， 検査結果からは故障しているとも正常であるとも決まらない部品に分類するプログラムを作成せよ．
入力
入力は複数のデータセットからなる．各データセットの形式は以下の通りである．入力は３つのゼロを含む行で終了する．
1 行目には 3 個の整数が空白区切りで書かれており， 順に電源の個数 a, モーターの個数 b, ケーブルの個数 c を表す．
2 行目には 1 個の整数が書かれており， 検査結果のリストに含まれる検査の回数 N が書かれている．
続く N 行は検査結果のリストを表す． 各行には， 4 個の整数 i, j, k, r が１つの空白を区切りとして書かれており， 電源 i とモーター j とケーブル k をつないで検査した結果が， 「合格」 (r=1 のとき) か「不合格」 (r=0 のとき) だったことを表す.
a, b, c, N は 1 ≤ a, b, c ≤ 100, 1 ≤ N ≤ 1000 を満たす.
データセットの数は 5 を超えない．
出力
データセットごとに以下の形式で出力する．各データセットの出力は a+b+c 行からなる.
i 行目 (1 ≤ i ≤ a+b+c)：
検査結果から部品 i が故障しているとわかる場合は 0 を出力する.
検査結果から部品 i が正常とわかる場合は 1 を出力する.
検査結果から部品 i が故障しているか正常であるかが決まらない場合は 2 を出力する.
入出力例
入力例
2 2 2
4
2 4 5 0
2 3 6 0
1 4 5 0
2 3 5 1
0 0 0
出力例
2
1
1
0
1
0
上記問題文と自動審判に使われるデータは、
情報オリンピック日本委員会
が作成し公開している問題文と採点用テストデータです。

Submitted solutions:

code_snippet: #include <bits/stdc++.h>
#define FOR(I,X,Y) for(long int I=X;I<Y;I++)
#define REP(I,X) for(long int I=X;I>=0;I--)
#define INF 1e9+7
using namespace std;

int main(){
  int a,b,c;
  vector<int> ans;
  while(1){
    cin >> a >> b >> c;
    if(!(a|| b || c))break;
    int N,i,j,k,l;
    cin >> N;
    set<int> unbroken;
    set<int> broken;
    int ii[N],jj[N],kk[N],ll[N];
    FOR(i,0,N)cin >> ii[i] >> jj[i] >> kk[i] >> ll[i];
    FOR(count1,0,N)FOR(count2,0,N){
      int i = ii[count2],j = jj[count2],k = kk[count2],l = ll[count2];
      if(l){
        unbroken.insert(i);
        unbroken.insert(j);
        unbroken.insert(k);
      }
      else{
        if(unbroken.count(i) && unbroken.count(j))broken.insert(k);
        if(unbroken.count(j) && unbroken.count(k))broken.insert(i);
        if(unbroken.count(k) && unbroken.count(i))broken.insert(j);
      }
    }
    FOR(i,1,a+b+c+1){
      if(unbroken.count(i))ans.push_back(1);
      else if(broken.count(i))ans.push_back(0);
      else ans.push_back(2);
    }
  }
  for(auto x:ans)cout << x << endl;
}
accuracy: 1
time_ms: 70
memory_kb: 3180
final_rank: 2

code_snippet: #include <bits/stdc++.h>
using namespace std;

//{{{
/********************************************************************/
struct Fast {Fast(){std::cin.tie(0);ios::sync_with_stdio(false);}} fast;

typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vector<int> > vii;
typedef queue<int> qi;
typedef stack<int> si;
typedef deque<int> dqi;

#define reps(i, a, b) for (int i = a; i < b; ++i)
#define rep(i, n) reps(i, 0, n)
#define REPS(i, a, b) reps(i, a, b)
#define REP(i, n) rep(i, n)
#define deps(i, a, b) for (int i = a; i >= b; --i)
#define dep(i, n) deps(i, n, 0)
#define DEPS(i, a, b) deps(i, a, b)
#define DEP(i, n) dep(i, n)

#define pf push_front
#define pb push_back
#define mp make_pair
#define fst first
#define FST fst
#define sec second
#define SEC sec
#define sz(obj) ((int)(obj).size())
#define all(v) (v).begin(), (v).end()
#define ALL(v) all(v)

const int INF = 999999999;
const int MOD = 1e9 + 7;
const int dx[] = {0, 1, 0, -1, 1, 1, -1, -1}, dy[] = {1, 0, -1, 0, 1, -1, -1, 1};

vector<string> split(const string &s, char delim) {
  vector<string> elems;
  string item;
  for (char ch: s) {
    if (ch == delim) {
      if (!item.empty()) elems.push_back(item);
      item.clear();
    }
    else item += ch;
  }
  if (!item.empty()) elems.push_back(item);
  return elems;
}

inline bool inside(int y, int x, int H, int W) {return y >= 0 && x >= 0 && y < H && x < W;}
inline int in() {int x; std::cin >> x; return x;}
template <typename T>
void print(std::vector<T>& v, char c = ' ') {
  REP(i, v.size()) {
    if (i != 0) std::cout << c;
    std::cout << v[i];
  }
  std::cout << endl;
}
template <typename T> void print(T x) { std::cout << x << '\n'; }

/****************************************************************/
//}}}

signed main()
{
  int a, b, c;
  
  while (cin >> a >> b >> c, a + b + c) {
    vector<int> v;
    int n = in();
    vector<pair<int, vector<int>>> vp;
    vector<int> ans;
    int r;
    rep(i, a + b + c) ans.pb(2);
    rep(i, n) {
      vector<int> ijk;
      rep(j, 3) ijk.pb(in());
      r = in();
      vp.pb(mp(r, ijk));
    }
    sort(all(vp));
    reverse(all(vp));
    rep(z, a + b + c) for (auto cvp : vp) {
      if (cvp.fst) {
        for (auto s : cvp.sec) {
          ans[s - 1] = 1;
        }
      }
      else {
        int i = cvp.sec[0] - 1, j = cvp.sec[1] - 1, k = cvp.sec[2] - 1;
        if (ans[i] == 1 and ans[j] == 1) ans[k] = 0;
        else if (ans[j] == 1 and ans[k] == 1) ans[i] = 0;
        else if (ans[k] == 1 and ans[i] == 1) ans[j] = 0;
      }
    }
    for (auto a : ans) print(a);
  }

  return (0);
}
accuracy: 1
time_ms: 10
memory_kb: 3152
final_rank: 1

code_snippet: #include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

#define REP(i,n) for(int (i)=0; (i)<(n); (i)++)
#define For(i,a,b) for(int (i)=(a); (i)<(b); (i)++)

bool find1fromcolumn(vector<vector<int> > vv, int c) {
    REP(i,vv.size()) {
        if (vv[i][c] == 1) return true;
    }
    return false;
}

int howmany2(int a, int b, int c) {
    int cnt = 0;
    if (a == 2) cnt++;
    if (b == 2) cnt++;
    if (c == 2) cnt++;
    return cnt;
}

void solve14(int a, int b, int c) {
    int n = a+b+c;
    int m;
    cin >> m;
    
    vector<int> ans;
    REP(i,n) ans.push_back(2);
    
    vector<vector<int> > vv;
    vv.resize(m);
    REP(i,m) vv[i].resize(n+3);
    REP(i,m) {
        REP(j,n+3) vv[i][j] = -1;
    }
    
    REP(i,m) {
        int p, q, r, s;
        scanf("%d%d%d%d", &p, &q, &r, &s);
        if (s) {
            vv[i][p-1] = 1; vv[i][n] = p;
            vv[i][q-1] = 1; vv[i][n+1] = q;
            vv[i][r-1] = 1; vv[i][n+2] = r;
            ans[p-1] = ans[q-1] = ans[r-1] = 1;
        }else {
            vv[i][p-1] = 2; vv[i][n] = p;
            vv[i][q-1] = 2; vv[i][n+1] = q;
            vv[i][r-1] = 2; vv[i][n+2] = r;
        }
    }
    
    REP(i,n) {
        if(find1fromcolumn(vv, i)) {
            REP(j,m) {
                vv[j][i] = 1;
            }
        }
    }
    
    REP(i,m) {
        //cout << howmany2(vv[i][vv[i][n]-1],vv[i][vv[i][n+1]-1],vv[i][vv[i][n+2]-1]) << endl;
        if (howmany2(vv[i][vv[i][n]-1],vv[i][vv[i][n+1]-1],vv[i][vv[i][n+2]-1]) == 1) {
            if (vv[i][vv[i][n]-1] == 2) {ans[vv[i][n]-1] = 0;}
            else if (vv[i][vv[i][n+1]-1] == 2) {ans[vv[i][n+1]-1] = 0;}
            else {ans[vv[i][n+2]-1] = 0;}
        }
    }
    
    REP(i,n) {
        if (ans[i] == 1 || ans[i] == 0) cout << ans[i] << endl;
        else cout << 2 << endl;
    }
}

int main() {
    int a, b, c;
    while(cin >> a >> b >> c, a+b+c) {
        solve14(a,b,c);
    }
    return 0;
}
accuracy: 1
time_ms: 130
memory_kb: 3668
final_rank: 3