Cod sursa(job #794840)

Utilizator mipsPavel Mircea mips Data 7 octombrie 2012 10:45:55
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
#include <cstdio>
#include <algorithm>
using namespace std;
ifstream fin("cutii.in");
ofstream fout("cutii.out");
vector<int> adj[4000];

vector< pair< int , pair< int , int> > > cutii;

int cost[4000];
bool finished[4000];
int t;
int n;
int tree[3500][3500];



int query(int x, int y) {
        //cout << "cer:" << x << ","  << y<<endl;
        int sum = 0;
        for (int a=x; a >= 0; a = (a & (a + 1)) - 1)
        for (int b=y; b >= 0; b = (b & (b + 1)) - 1)
          sum = max(sum,tree[a][b]);

        cout << "da:" << sum<<endl;
        return sum;
    }



// Increases value of k-th element by inc.
void set(int x, int y, int maxim) {
    //cout << "bag:" << x << ","  << y <<":"<<maxim<<endl;
    for (int k = x; k <= n; k |= k + 1)
    {
        for (int kk=y; kk <= n; kk |= kk + 1)
            tree[k][kk]= max(maxim, tree[k][kk] );
    }
}

void unset(int x, int y) {
    //cout << "pe 0 :" << x << ","  << y <<endl;
    for (int k = x; k <= n; k |= k + 1)
    {
        for (int kk=y; kk <= n; kk |= kk + 1)
            tree[k][kk]=0;
    }
}

int main()
{

    fin >> n >> t;
    n++;

    for (int tests=0; tests<t; tests++)
    {
        cutii.clear();
        for (int i=0; i<n; i++)
        {
            int a,b,c;
            fin >> a >> b >> c;
            cutii.push_back( make_pair(a,make_pair(b,c)) );
        }

        sort(cutii.begin(),cutii.end());
        int maximal =0;
        int lastRem=0;
        for (int i=0; i<n; i++)
        {
            if (i!=0)
            if (cutii[i].first != cutii[i-1].first)
            {
                for (int j=lastRem;j<i;j++)
                {
                    // set efectiv
                    set(cutii[j].second.first , cutii[j].second.second,maximal+1);
                }
                lastRem=i;
            }

            maximal = query(cutii[i].second.first-1,cutii[i].second.second-1);
            //cout << "gasit:" << query(cutii[i].second.first-1,cutii[i].second.second-1)<<endl;

        }

        for (int i=0; i<n; i++)
            unset(cutii[i].second.first,cutii[i].second.second);
        fout << maximal+1<<endl;

    }


}