I am trying to solve http://www.spoj.pl/problems/LITE/ using segment tree.
Here's the code but i am getting TLE. Can somebody help me to optimize the
code ?

#include<cstdio>
#include<algorithm>

struct node{
   int l;
   int r;
   bool el ;
   node *left;
   node *right;
};

struct node *build(int l, int r) {
   struct node *root = new node;
   root->l = l;
   root->r = r;
   root->el = 0;
   if(l==r) {
      root->left=NULL;
      root->right=NULL;
      return root;
   }
   root->left = build(l,(l+r)/2);
   root->right= build((l+r)/2+1,r);
   return root;
}

int query(struct node *root, int l, int r) {
   if(root==NULL || r<l)
   return 0;

   if((root->el) && (root->l)<=l && (root->r)>=r) {
      return (r - l + 1);
   }

   int mid = (root->l + root->r)/2;
   return query(root->left, l, std::min(mid,r)) + query(root->right,
std::max(mid+1,l), r);

}

void update(struct node *root, int l,int r) {
   if(root->l==l && root->r==r && (root->left==NULL || root->el)) {
      root->el = 1 - root->el;
      return;
   }

   if(root->el) {
      root->left->el = 1;
      root->right->el = 1;
      root->el = 0;
   }

   int mid = (root->l + root->r)/2;
   if(l <= mid)
   update(root->left, l, std::min(mid,r));
   if(r > mid)
   update(root->right, std::max(mid+1,l), r);
}

int main() {
   int N, M;
   scanf("%d %d",&N,&M);
   struct node *root =   build(1,N);
   int L,R;
   int c;
   while(M--) {
      scanf("%d %d %d\n",&c,&L,&R);
      if(c==0)
      update(root, L, R);
      else
      printf("%d\n",query(root,L,R));
   }
   return 0;
}





Aamir Khan | 3rd Year  | Computer Science & Engineering | IIT Roorkee

-- 
You received this message because you are subscribed to the Google Groups 
"Algorithm Geeks" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/algogeeks?hl=en.

Reply via email to