Cod sursa(job #2047032)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 24 octombrie 2017 14:52:24
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>
#include <algorithm>

using namespace std;
ifstream fin("cutii.in");
ofstream fout("cutii.out");
int t, i, n,rez, k, j;
int aib[3504][3504];
pair<int, pair<int, int > > v[3504];

int quarry(int x, int y)
{
    int i,  j, r=0;
    if(x==0||y==0)
        return 0;
    for(i=x;i>0;i-=(i&(-i)))
        for(j=y;j>0;j-=(j&(-j)))
        {
            r=max(r, aib[i][j]);
        }
    return r;
}

void update(int x, int y, int val)
{
    int i, j;
    for(i=x;i<=n;i+=(i&(-i)))
        for(j=y;j<=n;j+=(j&(-j)))
            aib[i][j]=max(val, aib[i][j]);
}

int main()
{
    fin>>n>>t;
    for(;t>0;t--)
    {
        for(i=1;i<=n;i++)
            fin>>v[i].first>>v[i].second.first>>v[i].second.second;
        sort(v+1, v+n+1);
        for(i=1;i<=n;i++){
            rez=quarry(v[i].second.first-1, v[i].second.second-1)+1;
            update(v[i].second.first, v[i].second.second, rez);
        }
        fout<<quarry(n, n)<<"\n";

        for(k=1;k<=n;k++)
        {
            for(i=v[k].second.first;i<=n;i+=(i&-i))
                for(j=v[k].second.second;j<=n;j+=(j&-j))
                    aib[i][j]=0;
        }
    }
    fin.close();
    fout.close();
    return 0;
}