Cod sursa(job #2047022)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 24 octombrie 2017 14:42:44
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 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++)
            if(v[i].first!=v[i-1].first)
            {
                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+1, n+1)<<"\n";
        for(k=1;k<=n;k++)
        {
            for(i=v[k].second.first;i<=n;i+=(i&-i))
                for(j=v[k].second.first;j<=n;j+=(j&-j))
                    aib[i][j]=0;
        }
    }
    fin.close();
    fout.close();
    return 0;
}