I am getting WA for long time in this problem but i dont understand why,plz someone help me
Code: Select all
//segment tree
//...........macro.........
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<algorithm>
#include<set>
#include<queue>
#include<stack>
#include<list>
#include<iostream>
#include<fstream>
#include<numeric>
#include<string>
#include<vector>
#include<map>
#include<iterator>
#define FOR(n) for(x=1;x<=n;x++)
#define FOR2(n) for(i=0;i<n;i++)
#define sc1(x) scanf("%d",&x)
#define sc2(x,y) scanf("%d%d",&x,&y)
#define sc3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define scl1(x) scanf("%lld",&x)
#define scl2(x,y) scanf("%lld%lld",&x,&y)
#define scl3(x,y,z) scanf("%lld%lld%lld",&x,&y,&z)
#define MAX 200048
using namespace std;
class data
{
public:
int m_c,m_v,l_c,l_v,r_c,r_v;
};
int x,y;
vector<data>tree(MAX*3);
vector<int>num(MAX+5);
//...........sample printing.............
void print(data& m,int nod)
{
printf("nod=%d value=%d count=%d left=%d(%d) right=%d(%d)\n",nod,m.m_v,m.m_c,m.l_v,m.l_c,m.r_v,m.r_c);
}
//..............clear memory............
void clr()
{
FOR(MAX)
{
tree[x].m_c=tree[x].r_c=tree[x].l_c=0;
tree[x].m_v=tree[x].r_v=tree[x].l_v=-MAX;
num[x]=0;
}
}
//..............build tree................
void build(int nod,int first,int last)
{
if(first==last)
{
tree[nod].m_c=tree[nod].r_c=tree[nod].l_c=1;
tree[nod].m_v=tree[nod].r_v=tree[nod].l_v=num[first];
return;
}
int mid=(first+last)/2;
int left=2*nod;
int right=2*nod+1;
build(left,first,mid);
build(right,mid+1,last);
if(tree[left].l_v==tree[right].l_v && tree[left].r_v==tree[right].r_v)
{
tree[nod].m_v=tree[nod].l_v=tree[nod].r_v=tree[right].l_v;
tree[nod].m_c=tree[nod].l_c=tree[nod].r_c=tree[right].l_c+tree[left].r_c;
}
else if(tree[left].l_v==tree[left].r_v && tree[right].l_v==tree[right].r_v)
{
tree[nod].l_v=tree[left].l_v;
tree[nod].l_c=tree[left].l_c;
tree[nod].r_v=tree[right].r_v;
tree[nod].r_c=tree[right].r_c;
if(tree[nod].l_c>=tree[nod].r_c)
{
tree[nod].m_c=tree[nod].l_c;
tree[nod].m_v=tree[nod].l_v;
}
else
{
tree[nod].m_c=tree[nod].r_c;
tree[nod].m_v=tree[nod].r_v;
}
}
else if(tree[left].r_v==tree[right].l_v)
{
tree[nod].l_v=tree[left].l_v;
tree[nod].l_c=tree[left].l_c;
tree[nod].r_v=tree[right].r_v;
tree[nod].r_c=tree[right].r_c;
if(tree[left].r_c+tree[right].l_c>=tree[nod].l_c && tree[left].r_c+tree[right].l_c>=tree[nod].r_c)
{
tree[nod].m_c=tree[left].r_c+tree[right].l_c;
tree[nod].m_v=tree[left].r_v;
if(tree[left].r_v==tree[right].r_v)
{
tree[nod].r_c+=tree[left].r_c;
}
else if(tree[left].l_v==tree[right].l_v)
{
tree[nod].l_c+=tree[right].l_c;
}
}
else if(tree[nod].l_c>=tree[nod].r_c)
{
tree[nod].m_v=tree[nod].l_v;
tree[nod].m_c=tree[nod].l_c;
}
else
{
tree[nod].m_v=tree[nod].r_v;
tree[nod].m_c=tree[nod].r_c;
}
}
else
{
tree[nod].l_v=tree[left].l_v;
tree[nod].l_c=tree[left].l_c;
tree[nod].r_v=tree[right].r_v;
tree[nod].r_c=tree[right].r_c;
if(tree[nod].l_c>=tree[nod].r_c)
{
tree[nod].m_v=tree[nod].l_v;
tree[nod].m_c=tree[nod].l_c;
}
else
{
tree[nod].m_v=tree[nod].r_v;
tree[nod].m_c=tree[nod].r_c;
}
}
}
//............queary.....................
data queary(int nod,int first,int last,int i,int j)
{
if(i<=first && j>=last)
{
return tree[nod];
}
int mid=(first+last)/2;
int left=2*nod;
int right=2*nod+1;
if(j<=mid) return queary(left,first,mid,i,j);
else if(i>mid) return queary(right,mid+1,last,i,j);
data r1=queary(left,first,mid,i,j);
data r2=queary(right,mid+1,last,i,j);
if(r1.l_v==r2.l_v && r1.r_v==r2.r_v)
{
r1.m_c=r1.l_c=r1.r_c=r1.m_c+r2.m_c;
r1.l_v=r1.r_v=r1.m_v=r1.l_v;
}
else if(r1.l_v==r1.r_v && r2.l_v==r2.r_v)
{
r1.r_v=r2.r_v;
r1.r_c=r2.r_c;
r1.m_v=r1.m_c>=r2.m_c?r1.m_v:r2.m_v;
r1.m_c=r1.m_c>=r2.m_c?r1.m_c:r2.m_c;
}
else if(r1.r_v==r2.l_v)
{
if(r1.r_c+r2.l_c>=r1.m_c && r1.r_c+r2.l_c>=r2.m_c)
{
r1.m_c=r1.r_c+r2.l_c;
r1.m_v=r1.r_v;
}
else if(r1.r_v==r2.r_v)
{
r1.m_v=r1.m_c>=(r1.r_c+r2.m_c)?r1.m_v:r2.m_v;
r1.m_c=r1.m_c>=(r1.r_c+r2.m_c)?r1.m_c:(r1.r_c+r2.m_c);
}
else if(r1.l_v==r2.l_v)
{
r1.m_v=r2.m_c>=(r2.l_c+r1.m_c)?r2.m_v:r2.l_v;
r1.m_c=r2.m_c>=(r2.l_c+r1.m_c)?r2.m_c:(r2.l_c+r1.m_c);
}
else
{
r1.m_v=r1.l_c>=r2.r_c?r1.l_v:r2.r_v;
r1.m_c=r1.l_c>=r2.r_c?r1.l_c:r2.r_c;
}
r1.r_v=r2.r_v;
r1.r_c=r2.r_c;
}
else
{
r1.r_v=r2.r_v;
r1.r_c=r2.r_c;
r1.m_v=r1.m_c>=r2.m_c?r1.m_v:r2.m_v;
r1.m_c=r1.m_c>=r2.m_c?r1.m_c:r2.m_c;
}
return r1;
}
//...........main function...............
int main()
{
int n,q;
int i,j;
data my;
//freopen("out.txt","w",stdout);
while(scanf("%d",&n)==1 )
{
if(n==0) break;
scanf("%d",&q);
clr();
FOR(n)
scanf("%d",&num[x]);
build(1,1,n);
FOR(q)
{
scanf("%d %d",&i,&j);
my=queary(1,1,n,i,j);
printf("%d\n",my.m_c);
}
}
return 0;
}