Cod sursa(job #382720)

Utilizator zalmanDanci Emanuel Sebastian zalman Data 14 ianuarie 2010 15:01:37
Problema Secventa 2 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <iostream>
#include <cstdio>
#include <vector>
#define NMAX 50010
#define pb push_back
using namespace std;


class nuss
{
	public: 
		int val, l, r, t;
};

nuss ob;
vector<nuss> sol;
int N, K, v[NMAX], i, sw, e, s, sum, poz;
int smax, lmax, val, nr;

void read(void)
{
	freopen("secv2.in", "r", stdin);
	scanf("%d %d", &N, &K);
	
	for(i = 1; i <= N; ++i)
	{
		scanf("%d", &v[i]);
		if(v[i] > 0)
			++nr;
	}
	
	fclose(stdin);
}

inline void add(int z, int x, int c, int v)
{
	ob.val = z;
	ob.l = x;
	ob.r = c;
	ob.t = v;
	sol.pb(ob);
}
void calc(void)
{
	int s = e = 1;
	add(v[1], 1, 1, 1);
	sum = v[1];
	
	for(i = 2; i <= N; ++i)
	{
		if((sum + v[i]) > 0)
		{
			sum += v[i];
			e = e + 1;
			add(sum, s, e, e - s + 1);
		}
		else
		{
			sum = v[i];
			s = e = i;
			add(v[i], i, i, 1);
		}
	}
	smax = INT_MIN;
	lmax = 0;
	for(i = 0; i < N; ++i)
		if((sol[i].val >= smax) && (sol[i].t > lmax))
			smax = sol[i].val, lmax = sol[i].t, poz = i;


}
void solve(void)
{
	if(nr >= K)
		calc();
	else
	{
		for(i = 1; i <= N; ++i)
			smax += v[i];
	}
}
void print(void)
{
	freopen("secv2.out", "w", stdout);
	if(nr < K)
		printf("%d %d %d", 1, N, smax);
	else
		printf("%d %d %d", sol[poz].l, sol[poz].r, sol[poz].val);
	
	fclose(stdout);
}
int main(void)
{
	read();
	solve();
	print();
	
	return 0;
}