GETTING Wa IN GSS1
TRIED ALMOST ALL CASES ON FORUM AND NET....GIVES CORRECT ANSWER FOR THEM
done using segment tree....maintained four fields in node of tree, 'i' argument in every fns indicates inedex of element in seg_tree to be filled.....
PLZ HELP !!!!!
(plz give the test case where i m failing)
#include <stdio.h>
using namespace std ;
struct node {
long int l_sum,max_sum,sum,r_sum ;
}seg_tree[9999999];
long int arr[100000],n,m ;
void create_seg_tree(long int,long int,long int) ;
long int maxxx(long int ,long int) ;
node get_sum(long int,long int,long int,long int,long int) ;
node merge (node a,node b) ;
int main () {
long int i ,j ,a,b;
scanf("%ld",&n) ;
for (i=0;i<n;i++)
scanf("%ld",&arr[i]) ;
create_seg_tree(0,0,n-1) ;
scanf("%ld",&m) ;
for (i=0;i<m;i++)
{ scanf("%ld%ld",&a,&b) ;
printf("%ld\n",get_sum(a-1,b-1,0,n-1,0).max_sum) ;
}
return 0 ;
}
long int maxxx(long int a,long int b) {
if (a>b)
return a ;
else
return b ;
}
node merge(node a,node b) {
node aux ;
aux.sum=a.sum + b.sum ;
if (a.l_sum==-999999999&&a.r_sum==-999999999&&a.max_sum==-999999999&&a.sum==-999999999)
return b ;
if (b.l_sum==-999999999&&b.r_sum==-999999999&&b.max_sum==-999999999&&b.sum==-999999999)
return a ;
aux.max_sum=maxxx(maxxx(a.max_sum , b.max_sum ) , a.r_sum + b.l_sum) ;
if (b.l_sum-a.sum+a.l_sum>=0)
aux.l_sum=b.l_sum+a.sum ;
else
aux.l_sum=a.l_sum ;
if (a.r_sum-b.sum+b.r_sum>=0)
aux.r_sum=a.r_sum+b.sum ;
else
aux.r_sum=b.r_sum ;
return aux ;
}
node get_sum (long int a,long int b,long int l,long int u,long int i) {
int m =(u+l)/2 ;
node aux ;
aux.l_sum=aux.max_sum=aux.r_sum=aux.sum=-999999999 ;
if (a<=l&&b>=u)
return seg_tree[i] ;
else if (b<l||a>u)
return aux ;
else
return merge(get_sum(a,b,l,m,2*i+1),get_sum(a,b,m+1,u,2*i+2)) ;
}
void create_seg_tree (long int i,long int l,long int u) {
long int m1=(u+l)/2 ;
long int m2=m1+1 ;
if (l==u)
{ seg_tree[i].l_sum=seg_tree[i].r_sum=seg_tree[i].max_sum=seg_tree[i].sum=arr[l] ;
}
else
{ create_seg_tree(2*i+1,l,m1) ;
create_seg_tree(2*i+2,m2,u) ;
seg_tree[i].sum=seg_tree[2*i+1].sum + seg_tree[2*i+2].sum ;
seg_tree[i].max_sum=maxxx(maxxx(seg_tree[2*i+1].max_sum , seg_tree[2*i+2].max_sum ) , seg_tree[2*i+1].r_sum + seg_tree[2*i+2].l_sum) ;
if (seg_tree[2*i+2].l_sum-seg_tree[2*i+1].sum+seg_tree[2*i+1].l_sum>=0)
seg_tree[i].l_sum=seg_tree[2*i+2].l_sum+seg_tree[2*i+1].sum ;
else
seg_tree[i].l_sum=seg_tree[2*i+1].l_sum ;
if (seg_tree[2*i+1].r_sum-seg_tree[2*i+2].sum+seg_tree[2*i+2].r_sum>=0)
seg_tree[i].r_sum=seg_tree[2*i+1].r_sum+seg_tree[2*i+2].sum ;
else
seg_tree[i].r_sum=seg_tree[2*i+2].r_sum ;
}
}