Pagini recente » Cod sursa (job #997435) | Cod sursa (job #2756727) | Cod sursa (job #532943) | Cod sursa (job #2507598) | Cod sursa (job #2714718)
#include <bits/stdc++.h>
#define ll long long
#define sz(x) (int)(x).size()
#define debug(v,n) for (int i = 1; i <= (n); ++i) cout << v[i] << " ";
#define next cout << '\n'
#define LSB(a) ((-a) & a)
using namespace std;
const int N = 100005;
int n, AIB[N];
int v[N];
void update(int pos, int val) {
while(pos <= n) {
//cout << pos - LSB(pos) + 1 << " " << pos << '\n';
AIB[pos] = max(AIB[pos], val);
pos += LSB(pos);
}
}
int check(int pos) {
int maxDone = 0;
while(pos > 0) {
// cout << pos - LSB(pos) + 1 << " " << pos << " " << AIB[pos]<< '\n';
if(maxDone < AIB[pos]) {
maxDone = AIB[pos];
}
pos -= LSB(pos);
}
return maxDone;
}
bool cmp(int a, int b) {
if(v[a] == v[b])
return a > b;
return v[a] < v[b];
}
int main() {
//ifstream fin("date.in.txt");
ifstream fin("scmax.in");
ofstream fout("scmax.out");
fin >> n;
vector<int> pos;
for (int i = 1; i <= n; ++i) {
fin >> v[i];
pos.push_back(i);
}
sort(pos.begin(), pos.end(), cmp);
for (int x : pos) {
int ad = max(AIB[x], AIB[x - LSB(x)]);
update(x, ad + 1);
//for (int i = 1; i <= n; ++i)
// cout << AIB[i] << " ";
//cout << '\n';
//cout << '\n';
}
fout << max(AIB[n], AIB[n - LSB(n)]) << "\n";
return 0;
}