Cod sursa(job #2756714)

Utilizator OvidRata Ovidiu Ovid Data 2 iunie 2021 16:47:39
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#include<bits/stdc++.h>
using namespace std;
#define INIT  ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define ll long long
#define pii pair<int, int>
#define count_bits __builtin_popcount
//#define int ll
#define int int16_t

int t, n, x[3501], y[3501], z[3501];
//map<int, int> hy, hz;
pair<int, pii> pr[3501];

ifstream fin("cutii.in"); ofstream fout("cutii.out");
#define cin fin
#define cout fout


int fw[3501][3501];

void update(int a, int b, int c){

    for(int i=a; i<=n; i+=(i&(-i))){
        for(int j=b; j<=n; j+=(j&(-j)) ){
            fw[i][j]=max(fw[i][j], c);
        }
    }
    return;
}

int query(int a, int b){
    int res=0;
    for(int i=a; i>0; i-=(i&(-i)) ){
        for(int j=b; j>0; j-=(j&(-j)) ){
            res=max(res, fw[i][j]);
        }
    }
    return res;
}


void update0(int a, int b){
    for(int i=a; i<=n; i+=(i&(-i)) ){
        for(int j=b; j<=n; j+=(j&(-j) ) ){
            fw[i][j]=0;
        }
    }
}


int32_t main(){
INIT
cin>>n>>t;


while(t--){
    multiset<pair<int, int>> my, mz;
    for(int i=1; i<=n; i++){
        cin>>x[i]>>y[i]>>z[i];
        my.insert({y[i], i}), mz.insert({z[i], i});
    }

    int cnty=0;
    for(auto it=my.begin(); it!=my.end(); it++){
        cnty++;
        y[it->sc ]=cnty;
    }

    int cntz=0;
    for(auto it=mz.begin(); it!=mz.end(); it++){
        cntz++;
        z[it->sc ]=cntz;
    }


    for(int i=1; i<=n; i++){
        pr[i]={x[i], {y[i], z[i]} };
    }
    sort(pr+1, pr+1+n);

    int fin=0;
    for(int i=1; i<=n; i++){
        //fenwick part
        x[i]=pr[i].ft,
        y[i]=pr[i].sc.ft, z[i]=pr[i].sc.sc;
        int res=query(y[i]-1, z[i]-1);
        fin=max(fin, (int)(res+1) );
        update(y[i], z[i], (int)(res+1) );
    }

    cout<<fin<<"\n";
    for(int i=1; i<=n; i++){
        update0(y[i], z[i]);
    }
}




return 0;
}