Cod sursa(job #1800912)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 8 noiembrie 2016 12:17:38
Problema Subsir crescator maximal Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
#include <fstream>
#include <algorithm>
#include <string>
#include <iomanip>
#include <cstring>
#include <map>
#include <iomanip>
#include <unordered_map>
#include <stack>
#include <bitset>
#define MOD 8192
#define pb push_back
#define INF 0x3f3f3f3f
#define ll long long
#define NMAX 100003
#define KMAX 33

using namespace std;

typedef pair<int, int> pii;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

pii v[NMAX];
int aint[4*NMAX];

void update_aib(int nod, int st, int dr, int pos, int val) {
	if(st==dr) {
		aint[nod]=max(aint[nod],val);
		return;
	}
	int mid=(st+dr)/2,fs=(nod<<1);

	if(pos<=mid) update_aib(fs,st,mid,pos,val);
	else update_aib(fs+1,mid+1,dr,pos,val);

	aint[nod]=max(aint[fs],aint[fs+1]);
}

int query_aib(int nod, int st, int dr, int qst, int qdr) {
	if(dr<qst || st>qdr) return 0;
	if(qst<=st && qdr>=dr) return aint[nod];

	int mid=(st+dr)/2,fs=(nod<<1);

	//query_aib(fs,st,mid,qst,qdr);
	//query_aib(fs+1,mid+1,dr,qst,qdr);

	return max(query_aib(fs,st,mid,qst,qdr), query_aib(fs+1,mid+1,dr,qst,qdr));
}

bool comp(pii A, pii B) {
	if(A.first==B.first) return A.second>B.second;
	else return A<B;
}

int main() {
	int n,i,maxstanga,x,res=0;

	fin>>n;
	for(i=1;i<=n;++i) {
		fin>>x;
		v[i]={x,i};
	}

	sort(v+1,v+n+1,comp);


	for(i=1;i<=n;++i) {
		maxstanga=query_aib(1,1,n,1,v[i].second);
		res=max(res,maxstanga+1);
		update_aib(1,1,n,v[i].second,maxstanga+1);

		//cout<<v[i].first<<' '<<v[i].second<<' '<<res<<'\n';
	}

	fout<<res;

	return 0;
}