最后三个点TLE是为什么
查看原帖
最后三个点TLE是为什么
675395
lpnp6楼主2023/3/8 14:52
#include<bits/stdc++.h>
#include <iostream>
#include <variant>
using namespace std;
struct node{
  int l,r;
  long long sum;
}tr[6000001];
int n,m,cnt=1;
void build(int root,int l,int r)
{
  tr[root].l=l,tr[root].r=r;
  if(l==r)
  {
    int input;
    cin>>input;
    tr[root].sum=input;
    return;
  }
  build(2*root,l,(l+r)/2);
  build(2*root+1,(l+r)/2+1,r);
  tr[root].sum=tr[2*root].sum+tr[2*root+1].sum;
}
void add(int root,int x,int y,int k)
{
  if(tr[root].r<x||tr[root].l>y)return;
  if(tr[root].l==tr[root].r)
  {
    tr[root].sum+=k;
    return;
  }
  add(2*root,x,y,k);
  add(2*root+1,x,y,k);
  tr[root].sum=tr[2*root].sum+tr[2*root+1].sum;

}
long long getsum(int root,int x,int y)
{
  if(tr[root].l>=x&&tr[root].r<=y)return tr[root].sum;
  if(tr[root].l>y||tr[root].r<x)return 0;
  long long s=0;
  if(y>=tr[root].l)s+=getsum(2*root,x,y);
  if(x<=tr[root].r)s+=getsum(2*root+1,x,y);
  return s;
}
int main()
{
  cin>>n>>m;
  build(1,1,n);
  while(m--)
  {
    int op;
    cin>>op;
    int x,y,k;
    switch (op)
    {
      case 1:
      cin>>x>>y>>k;
      add(1,x,y,k);
      break;
      case 2:
      cin>>x>>y;
      cout<<getsum(1,x,y)<<endl;
      break;
    }
  }
}
2023/3/8 14:52
加载中...