(LightOJ) 1242 – Similar Trees (II)

0

/***********Template Starts Here***********/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <functional>
#include <string>
#include <iostream>
#include <cctype>
#include <set>
#include <climits>
#include <iomanip>
#include <cassert>
//#include <unordered_map>

#define pb push_back
#define nl puts ("")
#define sp printf ( " " )
#define phl printf ( "hello\n" )
#define ff first
#define ss second
#define POPCOUNT __builtin_popcountll
#define RIGHTMOST __builtin_ctzll
#define LEFTMOST(x) (63-__builtin_clzll((x)))
#define MP make_pair
#define FOR(i,x,y) for(int i = (x) ; i <= (y) ; ++i)
#define ROF(i,x,y) for(int i = (y) ; i >= (x) ; --i)
#define CLR(x,y) memset(x,y,sizeof(x))
#define UNIQUE(V) (V).erase(unique((V).begin(),(V).end()),(V).end())
#define MIN(a,b) ((a)<(b)?(a):(b))
#define MAX(a,b) ((a)>(b)?(a):(b))
#define NUMDIGIT(x,y) (((int)(log10((x))/log10((y))))+1)
#define SQ(x) ((x)*(x))
#define ABS(x) ((x)<0?-(x):(x))
#define FABS(x) ((x)+eps<0?-(x):(x))
#define ALL(x) (x).begin(),(x).end()
#define LCM(x,y) (((x)/gcd((x),(y)))*(y))
#define SZ(x) ((int)(x).size())
#define NORM(x) if(x>=mod)x-=mod;

using namespace std;

typedef long long vlong;
typedef unsigned long long uvlong;
typedef pair < int, int > pii;
typedef pair < vlong, vlong > pll;
typedef vector<pii> vii;
typedef vector<int> vi;

const vlong inf = 2147383647;
const double pi = 2 * acos ( 0.0 );
const double eps = 1e-9;

#ifdef forthright48
     #include <ctime>
     clock_t tStart = clock();
     #define debug(args...) {dbg,args; cerr<<endl;}
     #define timeStamp printf("Execution Time: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC)
#else
    #define debug(args...)  // Just strip off all debug tokens
    #define timeStamp
#endif

struct debugger{
    template<typename T> debugger& operator , (const T& v){
        cerr<<v<<" ";
        return *this;
    }
}dbg;

//int knightDir[8][2] = { {-2,1},{-1,2},{1,2},{2,1},{2,-1},{-1,-2},{1,-2},{-2,-1} };
//int dir4[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};

inline vlong gcd ( vlong a, vlong b ) {
    a = ABS ( a ); b = ABS ( b );
    while ( b ) { a = a % b; swap ( a, b ); } return a;
}

vlong ext_gcd ( vlong A, vlong B, vlong *X, vlong *Y ){
    vlong x2, y2, x1, y1, x, y, r2, r1, q, r;
    x2 = 1; y2 = 0;
    x1 = 0; y1 = 1;
    for (r2 = A, r1 = B; r1 != 0; r2 = r1, r1 = r, x2 = x1, y2 = y1, x1 = x, y1 = y ) {
        q = r2 / r1;
        r = r2 % r1;
        x = x2 - (q * x1);
        y = y2 - (q * y1);
    }
    *X = x2; *Y = y2;
    return r2;
}

inline vlong modInv ( vlong a, vlong m ) {
    vlong x, y;
    ext_gcd( a, m, &x, &y );
    if ( x < 0 ) x += m; //modInv is never negative
    return x;
}

inline vlong power ( vlong a, vlong p ) {
    vlong res = 1, x = a;
    while ( p ) {
        if ( p & 1 ) res = ( res * x );
        x = ( x * x ); p >>= 1;
    }
    return res;
}

inline vlong bigmod ( vlong a, vlong p, vlong m ) {
    vlong res = 1 % m, x = a % m;
    while ( p ) {
        if ( p & 1 ) res = ( res * x ) % m;
        x = ( x * x ) % m; p >>= 1;
    }
    return res;
}

/***********Template Ends Here***********/

/*********** Hasib Templates Starts Here**********/

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

#define loop(i, n) for(int i=0; i<(n); i++)
#define sf scanf
#define pf printf
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) (v).begin(), (v).end()
#define PI acos(-1.0)
#define mem(ara, val) memset(ara, val, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define read(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)
#define vdump(x) cerr<<#x<<" = "<<x<<endl;
#define dump(args...) cerr,args; cerr<<endl

template<typename T>
ostream& operator<<(ostream& out, vector<T> v)
{
    out<<"[ ";

    loop(i, SZ(v))
    {
        if(i) out<<", ";
        out<<v[i];
    }

    out<<" ]";
    return out;
}

template<typename T1, typename T2>
ostream& operator<<(ostream &out, pair<T1, T2> p)
{
    out<<"( "<<p.fr<<", "<<p.sc<<")";
    return out;
}

template<typename T>
ostream& operator,(ostream &out, T x)
{
    out<<x<<" ";
    return out;
}


/**********Hasib Templates Ends Here**************/

/**
 *  WARTNING for me:
 *     Never use    FOR
 *     Never use    pii, pll, vi, vi
 *     Never use    ff, ss, phl, sp, nl
 */



#define NODE 107

struct KUHN{
        int left[NODE], right[NODE], vis[NODE], cc;
        vector<int> adj[NODE];

        KUHN() : cc(1) {

        }

        void clear(int n)
        {
                FOR(i, 0, n) adj[i].clear();
        }

        bool tryK(int v)
        {
                if(vis[v] == cc) return false;

                vis[v] = cc;

                loop(i, SZ(adj[v]))
                {
                        int t = adj[v][i];

                        if(right[t] == -1)
                        {
                                right[t] = v; left[v] = t;
                                return true;
                        }
                }

                loop(i, SZ(adj[v]))
                {
                        int t = adj[v][i];

                        if( tryK(right[t]))
                        {
                                right[t] = v; left[v] = t;
                                return true;
                        }
                }

                return false;
        }


        int match(int n)
        {
                int res = 0;
                bool done;
                CLR(left, -1); CLR(right, -1);
                do{
                        done = true; cc++;
                        FOR(i, 0, n)
                        {
                                if(left[i] == -1 && tryK(i))
                                {
                                        done = false;
                                }
                        }
                }while(!done);

                FOR(i, 0, n) res += (left[i] != -1);

                return res;
        }
};



vector<int>original[NODE], modified[NODE];
int orgN, modN;

bool orgVisited[NODE], modVisited[NODE];
bool isMatch[NODE][NODE];

bool match(int u, int v)
{
        orgVisited[u] = modVisited[v] = true;

        int uu, vv;

        KUHN kuhn;


        /// !wow! Got WA because I took kuhn as local variable, and didn't clear visited!
        mem(kuhn.vis, 0);

        kuhn.clear(NODE-1);

        loop(i, SZ(original[u]))
        {
                uu = original[u][i];

                if(orgVisited[uu]) continue;

                loop(j, SZ(modified[v]))
                {
                        vv = modified[v][j];

                        if(modVisited[vv]) continue;

                        if(match(uu, vv))
                        {
                                kuhn.adj[i].pb(j);
                        }
                }
        }

        orgVisited[u] = modVisited[v] = false;

        int m = kuhn.match( SZ(original[u]) + 2 );
        int child = SZ(original[u]) - 1;
        if(u == 1) child++;

        bool ret = (m == child);

        return ret;
}


void solve()
{
        //mem(orgVisited, 0); ///
        //mem(modVisited, 0); ///

        bool ret = match(1, 1);

        if(ret)
        {
                pf("Yes\n");
        }
        else
        {
                pf("No\n");
        }

}

int main ()
{
    #ifdef hasibpc
        read("input.txt");
        //write("output.txt");
    #endif // hasibpc

    int kases, kaseno = 0;
    int u, v;

    sf("%d", &kases);

    while(kases--)
    {
            sf("%d", &modN);

            FOR(i, 0, modN) modified[i].clear();

            for(int i=1; i<modN; i++)
            {
                    sf("%d %d", &u, &v);

                    //debug(u, v);

                    modified[u].pb(v);
                    modified[v].pb(u);
            }

            //vdump(endl);


            sf("%d", &orgN);

            FOR(i, 0, orgN) original[i].clear();

            for(int i=1; i<orgN; i++)
            {
                    sf("%d %d", &u, &v);

                    //debug(u, v);

                    original[u].pb(v);
                    original[v].pb(u);
            }


            pf("Case %d: ", ++kaseno);

            solve();

    }


    return 0;
}

(UVA) 369 – Combinations

0

/****************************************************************
   ▄█    █▄       ▄████████    ▄████████  ▄█  ▀█████████▄
  ███    ███     ███    ███   ███    ███ ███    ███    ███
  ███    ███     ███    ███   ███    █▀  ███   ███    ███
 ▄███▄▄▄▄███▄▄   ███    ███   ███        ███  ▄███▄▄▄██▀
▀▀███▀▀▀▀███▀  ▀███████████ ▀███████████ ███ ▀▀███▀▀▀██▄
  ███    ███     ███    ███          ███ ███    ███    ██▄
  ███    ███     ███    ███    ▄█    ███ ███    ███    ███
  ███    █▀      ███    █▀   ▄████████▀  █▀   ▄█████████▀
****************************************************************/



#include<bits/stdc++.h>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)

#define take(args...) asdf,args
#define dump(x) cerr<<#x<<" = "<<x<<endl
#define debug(args...) cerr,args; cerr<<endl;
using namespace std;


template<typename T>
ostream& operator<<(ostream& output, vector<T>&v)
{
    output<<"[ ";
    if(SZ(v))
    {
        output<<v[0];
    }
    FOR(i, 1, SZ(v))
    {
        output<<", "<<v[i];
    }
    output<<" ]";
    return output;
}

template<typename T1, typename T2>
ostream& operator<<(ostream& output, pair<T1, T2>&p)
{
    output<<"( "<<p.fr<<", "<<p.sc<<" )";
    return output;
}




template<typename T>
ostream& operator,(ostream& output, T x)
{
    output<<x<<" ";
    return output;
}



struct ASDF{
    ASDF& operator,(int &a) {
        sf("%d", &a);
        return *this;
    }
    ASDF& operator,(long int &a){
        sf("%ld", &a);
        return *this;
    }
    ASDF& operator,(long long int &a){
        sf("%lld", &a);
        return *this;
    }
    ASDF& operator,(char &c){
        sf("%c", &c);
        return *this;
    }
    ASDF& operator,(double &d){
        sf("%lf", &d);
        return *this;
    }

    template<typename T>
    ASDF& operator,(T &a){
        cin>>a;
        return *this;
    }
}asdf;



//Header ends here

#define MAXX 107


ll nCr[MAXX][MAXX];

ll ncr(int n, int r)
{
    if(r == 0)
    {
        return 1;
    }

    if(n < r)
    {
        return 0;
    }

    ll &ret = nCr[n][r];

    if(ret != -1) return ret;

    return ret = ncr(n-1, r) + ncr(n-1, r-1);
}





void init()
{
    mem(nCr, -1);
}


int main()
{
    init();


    ll N, R;

    while(true)
    {
        sf("%lld %lld", &N, &R);
        if(N==0 && R == 0)
        {
            break;
        }
        else
        {
            pf("%lld things taken %lld at a time is %lld exactly.\n", N, R, ncr(N,R));
        }
    }



    return 0;
}


(USACO) Shopping Offers (IOI’95)

0
/*
ID: himuhas1
TASK: shopping
LANG: C++
*/

/****************************************************************
   ▄█    █▄       ▄████████    ▄████████  ▄█  ▀█████████▄
  ███    ███     ███    ███   ███    ███ ███    ███    ███
  ███    ███     ███    ███   ███    █▀  ███   ███    ███
 ▄███▄▄▄▄███▄▄   ███    ███   ███        ███  ▄███▄▄▄██▀
▀▀███▀▀▀▀███▀  ▀███████████ ▀███████████ ███ ▀▀███▀▀▀██▄
  ███    ███     ███    ███          ███ ███    ███    ██▄
  ███    ███     ███    ███    ▄█    ███ ███    ███    ███
  ███    █▀      ███    █▀   ▄████████▀  █▀   ▄█████████▀
****************************************************************/



#include<bits/stdc++.h>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)

#define take(args...) asdf,args
#define dump(x) cerr<<#x<<" = "<<x<<endl
#define debug(args...) cerr,args; cerr<<endl;
using namespace std;


template<typename T>
ostream& operator<<(ostream& output, vector<T>&v)
{
    output<<"[ ";
    if(SZ(v))
    {
        output<<v[0];
    }
    FOR(i, 1, SZ(v))
    {
        output<<", "<<v[i];
    }
    output<<" ]";
    return output;
}

template<typename T1, typename T2>
ostream& operator<<(ostream& output, pair<T1, T2>&p)
{
    output<<"( "<<p.fr<<", "<<p.sc<<" )";
    return output;
}




template<typename T>
ostream& operator,(ostream& output, T x)
{
    output<<x<<" ";
    return output;
}



struct ASDF{
    ASDF& operator,(int &a) {
        sf("%d", &a);
        return *this;
    }
    ASDF& operator,(long int &a){
        sf("%ld", &a);
        return *this;
    }
    ASDF& operator,(long long int &a){
        sf("%lld", &a);
        return *this;
    }
    ASDF& operator,(char &c){
        sf("%c", &c);
        return *this;
    }
    ASDF& operator,(double &d){
        sf("%lf", &d);
        return *this;
    }

    template<typename T>
    ASDF& operator,(T &a){
        cin>>a;
        return *this;
    }
}asdf;



//Header ends here

#define MAXX 107
#define MAX_N 7

struct DATA{
    int n;
    vector<paii>v;
    int p;
};

DATA offers[MAXX];



int s, b;

map<int, int>cart_elements;
paii cart[MAX_N];

int dp[MAX_N][MAX_N][MAX_N][MAX_N][MAX_N][MAXX];


int rec(int items[MAX_N], int pos)
{
    int &ret = dp[ items[1] ][ items[2] ][ items[3] ][ items[4] ][ items[5] ][pos];
    if(ret != -1)
    {
        return ret;
    }

    if(pos >= s)
    {
        /// applied all the offers.

        ret = 0;
        for(int i=1; i<=5; i++)
        {
            //dump(items[i]);
            ret += (items[i] * cart[i].sc);
        }
        //cout<<endl;
        return ret;
    }
    else
    {
        ret = rec(items, pos+1);

        bool can_take_this_offer = true;

        loop(i, offers[pos].n)
        {
            if( cart_elements.find(offers[pos].v[i].fr) == cart_elements.end() || offers[pos].v[i].sc > items[ cart_elements[offers[pos].v[i].fr] ] )
            {
                can_take_this_offer = false;
            }
        }

        if(can_take_this_offer)
        {
            loop(i, offers[pos].n)
            {
                items[ cart_elements[offers[pos].v[i].fr] ] -= offers[pos].v[i].sc;
            }
        }

        ret = min(ret, rec(items, pos) + offers[pos].p);
        ret = min(ret, rec(items, pos+1) + offers[pos].p);

        if(can_take_this_offer)
        {
            loop(i, offers[pos].n)
            {
                items[ cart_elements[offers[pos].v[i].fr] ] += offers[pos].v[i].sc;
            }
        }



        return ret;



    }
}



int main()
{
    #ifndef hasibpc
        read("shopping.in");
        write("shopping.out");
    #endif // hasibpc

    sf("%d", &s);

    loop(i, s)
    {
        sf("%d", &offers[i].n);

        loop(j, offers[i].n)
        {
            int c, k;

            sf("%d %d", &c, &k);

            offers[i].v.pb(MP(c, k));
        }

        sf("%d", &offers[i].p);
    }

    sf("%d", &b);

    int id, quantity, price;

    int tmp = 1;
    int items[MAX_N];
    mem(items, 0);

    loop(i, b)
    {
        sf("%d %d %d", &id, &quantity, &price);
        cart[i+1] = MP(quantity, price);
        items[tmp] = quantity;
        cart_elements[id] = tmp++;

    }


    mem(dp, -1);
    cout<<rec(items, 0)<<endl;







}

(LightOj) 1033 – Generating Palindromes

0
//link: http://lightoj.com/volume_showproblem.php?problem=1033

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)
#define dump(x) cout<<#x<<" = "<<x<<endl

using namespace std;

#define take(args...) asdf,args
#define debug(args...) asdfg,args; cout<<endl
struct ASDF{
    ASDF& operator,(int &a) {
        sf("%d", &a);
        return *this;
    }
    ASDF& operator,(long int &a){
        sf("%ld", &a);
        return *this;
    }
    ASDF& operator,(long long int &a){
        sf("%lld", &a);
        return *this;
    }
    ASDF& operator,(char &c){
        sf("%c", &c);
        return *this;
    }
    ASDF& operator,(double &d){
        sf("%lf", &d);
        return *this;
    }

    template<typename T>
    ASDF& operator,(T &a){
        cin>>a;
        return *this;
    }
}asdf;
struct ASDFG{
    template<typename T>
    ASDFG& operator,(vector<T> &v){
        pf("[");
        cout<<v[0];
        FOR(i, 1, SZ(v)){
            cout<<", "<<v[i];
        }
        pf("]");
        return *this;
    }

    template<typename T>
    ASDFG& operator,(T x) {
        cout<<x<<" ";
        return *this;
    }


}asdfg;



//Header ends here
#define MAXX 102

char str[MAXX];

int dp[MAXX][MAXX];
int len;


int min_cost(int i, int j)
{
    if(i < 0) return len - j;
    if(j >= len) return i+1;

    int &ret = dp[i][j];
    if(ret != -1) return ret;


    if(str[i] == str[j])
    {
        return ret = min_cost(i-1, j+1);
    }
    else
    {
        return ret = 1 + min( min_cost(i-1, j), min_cost(i, j+1) );
    }

}



int main()
{
    int kases, kaseno = 0;
    take(kases);



    while(kases--)
    {
        scanf("%s", str);
        len = strlen(str);
        mem(dp, -1);
        int res = 1<<29;
        for(int i=0; i<len-1; i++)
        {
            res = min( res, min_cost(i, i) );
            res = min(res, min_cost(i, i+1));
        }
        pf("Case %d: %d\n", ++kaseno, len==1?0:res);
    }

}

Another solution using LCS directly


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)
#define dump(x) cout<<#x<<" = "<<x<<endl

using namespace std;

#define take(args...) asdf,args
#define debug(args...) asdfg,args; cout<<endl
struct ASDF{
    ASDF& operator,(int &a) {
        sf("%d", &a);
        return *this;
    }
    ASDF& operator,(long int &a){
        sf("%ld", &a);
        return *this;
    }
    ASDF& operator,(long long int &a){
        sf("%lld", &a);
        return *this;
    }
    ASDF& operator,(char &c){
        sf("%c", &c);
        return *this;
    }
    ASDF& operator,(double &d){
        sf("%lf", &d);
        return *this;
    }

    template<typename T>
    ASDF& operator,(T &a){
        cin>>a;
        return *this;
    }
}asdf;
struct ASDFG{
    template<typename T>
    ASDFG& operator,(vector<T> &v){
        pf("[");
        cout<<v[0];
        FOR(i, 1, SZ(v)){
            cout<<", "<<v[i];
        }
        pf("]");
        return *this;
    }

    template<typename T>
    ASDFG& operator,(T x) {
        cout<<x<<" ";
        return *this;
    }


}asdfg;



//Header ends here
#define MAXX 102

char str[MAXX];

int dp[MAXX][MAXX];
int len;

int LCS(int i, int j)
{
    if(i<0 || j>=len) return 0;
    int &ret = dp[i][j];
    if(ret != -1) return ret;

    if(str[i] == str[j]) return ret = 1 + LCS(i-1, j+1);
    return ret = max(LCS(i-1, j), LCS(i, j+1));
}




int main()
{
    int kases, kaseno = 0;
    take(kases);



    while(kases--)
    {
        scanf("%s", str);
        len = strlen(str);
        mem(dp, -1);
        int res = 1<<29;
        for(int i=0; i<len-1; i++)
        {
            res = min(res, len+1 - 2*LCS(i, i));
            res = min(res, len - 2*LCS(i, i+1));
        }

        pf("Case %d: %d\n", ++kaseno, len==1?0:res);
    }

}


(SPOJ) 8425. Coloring Trees

0
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)
#define dump(x) cout<<#x<<" = "<<x<<endl

using namespace std;


#define MAXX 100002
char color[MAXX];
int parent[MAXX];
vector<int>graph[MAXX];


int find(int u)
{
    if(parent[u] == u) return u;
    return parent[u] = find(parent[u]);
}

int main()
{
    int N;
    int x, a, b;
    sf("%d", &N);
    loop(i, N)
    {
        color[i] = -1;
        parent[i] = i;
    }
    N--;
    loop(i, N)
    {
        sf("%d %d", &a, &b);
        graph[a].pb(b);
        graph[b].pb(a);
    }

    int Q;
    sf("%d", &Q);

    loop(i, Q)
    {
        sf("%d %d %d", &x, &a, &b);
        if(x == 1)
        {
            color[a] = b;
            loop(i, SZ(graph[a]))
            {
                if(color[graph[a][i]] == b)
                {
                    parent[find(a)] = find(graph[a][i]);
                }
            }
        }
        else if(x==2)
        {
            if(find(a) == find(b))
            {
                if(a!=b || color[a] != -1 )
                    pf("YES\n");
                else
                    pf("NO\n");
            }

            else
                pf("NO\n");
        }
    }
    return 0;
}

(SPOJ) 61. Brackets

0
//link: http://www.spoj.com/problems/BRCKTS/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)
#define dump(x) cout<<#x<<" = "<<x<<endl

using namespace std;

#define take(args...) asdf,args
#define debug(args...) asdfg,args; cout<<endl
struct ASDF{
    ASDF& operator,(int &a) {
        sf("%d", &a);
        return *this;
    }
    ASDF& operator,(long int &a){
        sf("%ld", &a);
        return *this;
    }
    ASDF& operator,(long long int &a){
        sf("%lld", &a);
        return *this;
    }
    ASDF& operator,(char &c){
        sf("%c", &c);
        return *this;
    }
    ASDF& operator,(double &d){
        sf("%lf", &d);
        return *this;
    }

    template<typename T>
    ASDF& operator,(T &a){
        cin>>a;
        return *this;
    }
}asdf;
struct ASDFG{
    template<typename T>
    ASDFG& operator,(vector<T> &v){
        pf("[");
        cout<<v[0];
        FOR(i, 1, SZ(v)){
            cout<<", "<<v[i];
        }
        pf("]");
        return *this;
    }

    template<typename T>
    ASDFG& operator,(T x) {
        cout<<x<<" ";
        return *this;
    }


}asdfg;



//Header ends here

struct DATA
{
    int needed_opening;
    int needed_closing;
    DATA()
    {
        needed_closing = needed_opening = 0;
    }
};

#define MAXX 30002

DATA sum[4*MAXX];
char str[MAXX];


void insert(int idx, int st, int ed)
{
    if(st == ed)
    {

        if(str[st] == '(')
        {
            sum[idx].needed_closing = 1;
            sum[idx].needed_opening = 0;
        }
        else
        {
            sum[idx].needed_opening = 1;
            sum[idx].needed_closing = 0;
        }
    }
    else
    {
        int l = idx*2;
        int r = l +1;
        int mid = (st+ed)/2;

        insert(l, st, mid);
        insert(r, mid+1, ed);

        int r_closing_min = min(sum[l].needed_closing, sum[r].needed_opening);

        sum[idx].needed_closing = sum[l].needed_closing - r_closing_min + sum[r].needed_closing;

        sum[idx].needed_opening = sum[r].needed_opening - r_closing_min + sum[l].needed_opening;
    }
}

void update(int idx, int st, int ed, int pos)
{
    if(st == ed)
    {
        if(str[pos] == '(')
        {
            sum[idx].needed_closing--;
            sum[idx].needed_opening++;
            str[pos] = ')';
        }
        else
        {
            sum[idx].needed_closing++;
            sum[idx].needed_opening--;
            str[pos] = '(';
        }
    }
    else
    {
        int l = idx*2;
        int r = l + 1;
        int mid = (st+ed)/2;
        if(pos <= mid)
        {
            update(l, st, mid, pos);
        }
        else
        {
            update(r, mid+1, ed, pos);
        }


        int r_closing_min = min(sum[l].needed_closing, sum[r].needed_opening);

        sum[idx].needed_closing = sum[l].needed_closing - r_closing_min + sum[r].needed_closing;

        sum[idx].needed_opening = sum[r].needed_opening - r_closing_min + sum[l].needed_opening;
    }
}

int main()
{
    int stlen, m, k;

    loop(kaseno, 10)
    {
        pf("Test %d:\n", kaseno+1);
        sf("%d", &stlen);
        stlen--;
        sf("%s", str);
        insert(1, 0, stlen);


        sf("%d", &m);
        loop(i, m)
        {
            sf("%d", &k);
            if(k == 0)
            {
                if(sum[1].needed_closing == 0 && sum[1].needed_opening == 0)
                {
                    pf("YES\n");
                }
                else
                {
                    pf("NO\n");
                }
            }
            else
            {
                update(1, 0, stlen, k-1);
            }
        }
    }



    return 0;
}

(USACO) Zero Sum

0

/*
ID: himuhas1
TASK: zerosum
LANG: C++
*/

#include
#include
#include
#include
#include

#include
#include
#include
#include
#include<map>
#include

#define FOR(i, s, e) for(int i=s; i&lt;e; i++)
#define loop(i, n) FOR(i, 0, n)
#define gi(a) sf(&quot;%d&quot;, &amp;a)
#define gi2(a, b) sf(&quot;%d%d&quot;, &amp;a, &amp;b)
#define gi3(a, b, c) sf(&quot;%d%d%d&quot;, &amp;a, &amp;b, &amp;c)
#define gi4(a, b, c, d) sf(&quot;%d%d%d%d&quot;, &amp;a, &amp;b, &amp;c, &amp;d)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair
#define pall pair
#define SZ(a) int(a.size())
#define read freopen("input.txt", "r", stdin)
#define write freopen("output.txt", "w", stdout)

using namespace std;

int n;
vectorv;

void rec(int nxt)
{
if(nxt == n+1)
{
#if 0
loop(j, SZ(v))
{
if(v[j] &gt; 9)
cout&lt;&lt;(char)v[j];
else
cout&lt;&lt;v[j];
}
cout&lt;&lt;endl;
#endif
int lastSum = 0, tmp = 0;
char sign = '+';
int i = 0;

while(i 9)
{
break;
}
lastSum = lastSum*10 + v[i];

i++;
}

while(i &lt; SZ(v))
{
if(v[i] &lt; 10)
{//a number
tmp = tmp*10 + v[i];
}
else
{
if(sign == '+')
{
lastSum += tmp;
}
else
{
lastSum -= tmp;
}
tmp = 0;
sign = v[i];
}
i++;
}

if(sign == '+')
{
lastSum += tmp;
}
else
{
lastSum -= tmp;
}

if(lastSum == 0)
{
cout&lt; 9)
{
pf("%c", v[i]);
}
else
{
if(v[i-1] &lt; 10)
{
pf(&quot; &quot;);
}
pf(&quot;%d&quot;, v[i]);
}
}
cout&lt;&lt;endl;
}
//cout&lt;&lt;lastSum&lt;&gt;n;
v.pb(1);

rec(2);

return 0;
}

(UVa) 10226 – Hardwood Species

0
/*
user: php
link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1167
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define gi(a) sf("%d", &a)
#define gi2(a, b) sf("%d%d", &a, &b)
#define gi3(a, b, c) sf("%d%d%d", &a, &b, &c)
#define gi4(a, b, c, d) sf("%d%d%d%d", &a, &b, &c, &d)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read freopen("input.txt", "r", stdin)
#define write freopen("output.txt", "w", stdout)

using namespace std;


#define ALPHA_LIST 128

struct node{
    int cnt_trees;
    node *child[ALPHA_LIST];

    node()
    {
        cnt_trees = 0;
        loop(i, ALPHA_LIST)
        {
            child[i] = NULL;
        }
    }
}*head;

int total;


/*
void clearTree(node *p)
{
    loop(i, ALPHA_LIST)
    {
        if(p->child[i] != NULL)
        {
            clearTree(p->child[i]);
        }
    }
    delete p;
}

void init()
{
    head = new node();
}


int toint(char c)
{
    if(c== ' ')
        return 26;
    if('a' <= c && c <= 'z')
        return c - 'a';
    else
        return c - 'A';
}
*/

void insert(char *word)
{
    //cout<<"inserting " << word<<endl;
    node *current = head;

    int ch;

    while(*word != '\0')
    {
        ch = *word;

        if(current->child[ch] == NULL)
            current->child[ch] = new node();
        current = current->child[ch];
        word++;
    }
    current->cnt_trees++;
}

vector<char> name_list;

void printTree(node *current)
{
    if(current->cnt_trees)
    {
        FOR(i, 0, SZ(name_list))
        {
            pf("%c", name_list[i]);
        }
        pf(" %.4lf\n", (100.0*current->cnt_trees)/(double)total);
        //current->cnt_trees = 0;
    }

    loop(i, ALPHA_LIST)
    {
        if(current->child[i] != NULL)
        {
            name_list.pb(i);
            printTree(current->child[i]);
            name_list.pop_back();
        }
    }

    delete current;
    //current = NULL;
}


int main()
{
    int kases;
    char names[35];
    bool blank = 0;

    gi(kases);
    cin.ignore();
    cin.ignore();

    while(kases--)
    {
        if(blank) pf("\n");
        blank = 1;

        head = new node();

        //init();

        //cout<<head<<endl;

        total = 0;
        while(gets(names))
        {
            if(strlen(names) == 0) break;
            insert(names);
            total++;
        }

        printTree(head);

        //head = NULL;
        //cout<<head<<endl<<endl<<endl;

        //clearTree(head);
    }


    return 0;
}


(USACO) Checker Challenge

0
/*
user: php
link: http://cerberus.delos.com:790/usacoprob2?a=T7bTTAFb5qU&S=checker
*/

/*
ID: himuhas1
TASK: checker
LANG: C++
*/


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define gi(a) sf("%d", &a)
#define gi2(a, b) sf("%d%d", &a, &b)
#define gi3(a, b, c) sf("%d%d%d", &a, &b, &c)
#define gi4(a, b, c, d) sf("%d%d%d%d", &a, &b, &c, &d)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read freopen("input.txt", "r", stdin)
#define write freopen("output.txt", "w", stdout)

using namespace std;
#define MAXX 14

int N;
int cnt = 0;
int mask[MAXX][MAXX];
bool used[MAXX][MAXX];

/*
void getState()
{
    loop(i, N)
    {
        loop(j, N)
        {
            if((mask[i] & (1<<j)) != 0)
            {
                pf("1 ");
            }
            else
            {
                pf("0 ");
            }
        }
        pf("\n");
    }
}
*/


void rec(int row)
{
    if(row == N)
    {
        if(cnt < 3)
        {
            loop(i, N)
            {
                if(i) pf(" ");
                loop(j, N)
                {
                    if(used[i][j])
                    {
                        pf("%d", j+1);
                        break;
                    }
                }
            }
            pf("\n");
        }
        cnt++;
        return;
    }
    else
    {
        loop(i, N)
        {
            if( mask[row][i] == 0 )
            {

                for(int r=row+1,p=i-1; r<N && p>-1; r++, p--)
                {
                    mask[r][p]++;
                }

                for(int r=row+1, q=i+1; r<N && q<N; r++, q++)
                {
                    mask[r][q]++;
                }

                for(int r=row+1; r<N; r++)
                {
                    mask[r][i]++;
                }

                used[row][i] = 1;


                //getState();
                //cout<<endl<<endl;

                rec(row+1);


                for(int r=row+1,p=i-1; r<N && p>-1; r++, p--)
                {
                    mask[r][p]--;
                }

                for(int r=row+1, q=i+1; r<N && q<N; r++, q++)
                {
                    mask[r][q]--;
                }

                for(int r=row+1; r<N; r++)
                {
                    mask[r][i]--;
                }

                used[row][i] = 0;
            }
        }
    }





}

int main()
{
    freopen("checker.in", "r", stdin);
    freopen("checker.out", "w", stdout);

    mem(mask, 0);
    mem(used, 0);

    int row = 0;

    cin>>N;



    loop(i, N)
    {
            for(int r=row+1,p=i-1; r<N && p>-1; r++, p--)
            {
                mask[r][p]++;
            }

            for(int r=row+1, q=i+1; r<N && q<N; r++, q++)
            {
                mask[r][q]++;
            }

            for(int r=row+1; r<N; r++)
            {
                mask[r][i]++;
            }

            used[row][i] = 1;


            //getState();
            //cout<<endl<<endl;

            rec(row+1);


            for(int r=row+1,p=i-1; r<N && p>-1; r++, p--)
            {
                mask[r][p]--;
            }

            for(int r=row+1, q=i+1; r<N && q<N; r++, q++)
            {
                mask[r][q]--;
            }

            for(int r=row+1; r<N; r++)
            {
                mask[r][i]--;
            }

            used[row][i] = 0;
    }



    cout<<cnt<<endl;

    //getState();



    return 0;
}


(lightoj) 1087 – Diablo

0
/*
link: http://lightoj.com/volume_showproblem.php?problem=1087
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 10000000000
#define mod abs
#define pf printf
#define sf scanf

using namespace std;

#define MAXX 150005

int cnt_elements[4*MAXX];
vector<int>ids;
int cnt;
int cnt_query;
int total;


void update(int idx, int st, int ed, int pos, int value)
{
    //cout<<"calling with "<<idx<<" and start = "<<st<<" and end ="<<ed<<"and pos = "<<pos<<endl;
    if(st == pos && pos == ed)
    {
        cnt_elements[idx] += value;
        return;
    }


    int l = idx<<1;
    int r = l + 1;
    int mid = (st + ed) / 2;

    if(pos <= mid)
    {
        update(l, st, mid, pos, value);
    }
    else
    {
        update(r, mid+1, ed, pos, value);
    }

    cnt_elements[idx] = cnt_elements[l] + cnt_elements[r];
}


int get(int idx, int st, int ed, int pos)
{
    //cout<<"calling with "<<idx<<" and start = "<<st<<" and end ="<<ed<<"and pos = "<<pos<<" and number of elements = "<<cnt_elements[idx]<<endl;

    cnt_elements[idx]--;
    if(st == ed  )
    {
        return st;
    }

    int l = idx<<1;
    int r = l + 1;
    int mid = (st + ed) / 2;

    if( pos <= cnt_elements[l] )
    {
        return get(l, st, mid, pos);
    }
    else
    {
        return get(r, mid +1, ed, pos - cnt_elements[l]);
    }
}





int main()
{
    //read();
    //write();
    int kases, kaseno = 0;
    getint(kases);
    int num;
    char cmd[4];
    int id;
    int temp;

    while(kases--)
    {
        pf("Case %d:\n", ++kaseno);
        getint(cnt); getint(cnt_query);
        total = cnt + cnt_query;
        temp = cnt;
        mem(cnt_elements, 0);
        ids.clear();

        loop(i, cnt)
        {
            getint(num);
            ids.pb(num);
            update(1, 1, total, i+1, 1);
        }



        loop(t, cnt_query)
        {
            sf("%s", cmd);
            getint(num);


            if(cmd[0] == 'c')
            {


                if(num > cnt)
                {
                    pf("none\n");
                    continue;
                }

                cnt--;

                id = get(1,1, total, num);
                pf("%d\n", ids[id-1]);
            }
            else
            {
                ids.pb(num);
                temp++;
                cnt++;
                update(1, 1, total, temp, 1);

            }
        }



    }

    return 0;
}